Skip to content

Instantly share code, notes, and snippets.

@biank88
Last active May 26, 2017 03:07
Show Gist options
  • Save biank88/3919e51dab351eb2c2ee441eeb114840 to your computer and use it in GitHub Desktop.
Save biank88/3919e51dab351eb2c2ee441eeb114840 to your computer and use it in GitHub Desktop.
QSTK-tutoria-9-notebook
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import math\n",
"import copy\n",
"import QSTK.qstkutil.qsdateutil as du\n",
"import datetime as dt\n",
"import QSTK.qstkutil.DataAccess as da\n",
"import QSTK.qstkutil.tsutil as tsu\n",
"import QSTK.qstkstudy.EventProfiler as ep ## This function has been reimplemented in this notebook"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### find_events() function definition"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def find_events(ls_symbols, d_data):\n",
" ''' Finding the event dataframe '''\n",
" df_close = d_data['close']\n",
" ts_market = df_close['SPY']\n",
"\n",
" # Creating an empty dataframe\n",
" df_events = copy.deepcopy(df_close)\n",
" df_events = df_events * np.NAN\n",
"\n",
" # Time stamps for the event range\n",
" ldt_timestamps = df_close.index\n",
"\n",
" for s_sym in ls_symbols:\n",
" for i in range(1, len(ldt_timestamps)):\n",
" # Calculating the returns for this timestamp\n",
" f_symprice_today = df_close[s_sym].ix[ldt_timestamps[i]]\n",
" f_symprice_yest = df_close[s_sym].ix[ldt_timestamps[i - 1]]\n",
" f_marketprice_today = ts_market.ix[ldt_timestamps[i]]\n",
" f_marketprice_yest = ts_market.ix[ldt_timestamps[i - 1]]\n",
" f_symreturn_today = (f_symprice_today / f_symprice_yest) - 1\n",
" f_marketreturn_today = (f_marketprice_today / f_marketprice_yest) - 1\n",
"\n",
" # Event is found if the symbol is down more then 3% while the\n",
" # market is up more then 2%\n",
" if f_symreturn_today <= -0.03 and f_marketreturn_today >= 0.02:\n",
" df_events[s_sym].ix[ldt_timestamps[i]] = 1\n",
"\n",
" return df_events"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### eventprofiler2() function def"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import QSTK.qstkutil.DataAccess as da\n",
"import QSTK.qstkutil.tsutil as tsu\n",
"import QSTK.qstkutil.qsdateutil as du\n",
"\n",
"def eventprofiler2(df_events_arg, d_data, i_lookback=20, i_lookforward=20,\n",
" s_filename='study', b_market_neutral=True, b_errorbars=True,\n",
" s_market_sym='SPY', show = False):\n",
" '''\n",
" Event Profiler for an event matrix\n",
" '''\n",
" df_close = d_data['close'].copy()\n",
" df_rets = df_close.copy()\n",
"\n",
" # Do not modify the original event dataframe.\n",
" df_events = df_events_arg.copy()\n",
" \n",
" # Calculate the daily returns of the prices. (Inplace calculation)\n",
" # returnize0 works on ndarray and not dataframes.\n",
" tsu.returnize0(df_rets.values)\n",
"\n",
" # (optional) remove market component from daily returns (suppose beta==1 )\n",
" if b_market_neutral == True:\n",
" \n",
" ## the following line caused an error, so it has been modified\n",
" # df_rets = df_rets - df_rets[s_market_sym]\n",
" \n",
" df_rets = df_rets.sub(df_rets[s_market_sym].values, axis=0)\n",
" \n",
" del df_rets[s_market_sym]\n",
" del df_events[s_market_sym]\n",
"\n",
" df_close = df_close.reindex(columns=df_events.columns)\n",
"\n",
" # Remove the starting and the end events\n",
" df_events.values[0:i_lookback, :] = np.NaN\n",
" df_events.values[-i_lookforward:, :] = np.NaN\n",
"\n",
" # Get the number of events in the matrix \n",
" i_no_events = int(np.logical_not(np.isnan(df_events.values)).sum())\n",
" assert i_no_events > 0, \"Zero events in the event matrix\"\n",
" na_event_rets = \"False\"\n",
"\n",
" # Look for the events and push them to a matrix\n",
" for i, s_sym in enumerate(df_events.columns):\n",
" for j, dt_date in enumerate(df_events.index):\n",
" if df_events[s_sym][dt_date] == 1:\n",
" na_ret = df_rets[s_sym][j - i_lookback:j + 1 + i_lookforward]\n",
" if type(na_event_rets) == type(\"\"):\n",
" na_event_rets = na_ret\n",
" else:\n",
" na_event_rets = np.vstack((na_event_rets, na_ret))\n",
"\n",
" if len(na_event_rets.shape) == 1:\n",
" na_event_rets = np.expand_dims(na_event_rets, axis=0)\n",
"\n",
" # Compute daily returns\n",
" na_event_rets = np.cumprod(na_event_rets + 1, axis=1)\n",
" na_event_rets = (na_event_rets.T / na_event_rets[:, i_lookback]).T\n",
"\n",
" # Study Params\n",
" na_mean = np.mean(na_event_rets, axis=0)\n",
" na_std = np.std(na_event_rets, axis=0)\n",
" li_time = range(-i_lookback, i_lookforward + 1)\n",
"\n",
" # Plot the chart\n",
" plt.clf()\n",
" plt.axhline(y=1.0, xmin=-i_lookback, xmax=i_lookforward, color='k')\n",
" \n",
" if b_errorbars == True:\n",
" plt.errorbar(li_time[i_lookback:], na_mean[i_lookback:],\n",
" yerr=na_std[i_lookback:], ecolor='#AAAAFF',\n",
" alpha=0.5) #Changed alpha from 0.1 to 0.5\n",
" \n",
" plt.plot(li_time, na_mean, linewidth=3, label='mean', color='b')\n",
" plt.xlim(-i_lookback - 1, i_lookforward + 1)\n",
" \n",
" if b_market_neutral == True:\n",
" plt.title('Market Relative mean return of ' + str(i_no_events) + ' events')\n",
" else:\n",
" plt.title('Mean return of ' + str(i_no_events) + ' events')\n",
" \n",
" plt.xlabel('Days')\n",
" plt.ylabel('Cumulative Returns')\n",
" plt.savefig(s_filename, format='pdf')\n",
" \n",
" if show == True:\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Define a time interval"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"dt_start = dt.datetime(2008, 1, 1)\n",
"dt_end = dt.datetime(2009, 12, 31)\n",
"ldt_timestamps = du.getNYSEdays(dt_start, dt_end, dt.timedelta(hours=16))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Define the desired list of symbols\n",
"Note that the list should contain the list of equities from SP500 (as it was in 2012) plus a market index (i.e. _SPY_)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"dataobj = da.DataAccess('Yahoo')\n",
"ls_symbols = dataobj.get_symbols_from_list('sp5002012')\n",
"ls_symbols.append('SPY')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Define and create pandas dataframe objects"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"ls_keys = ['open', 'high', 'low', 'close', 'volume', 'actual_close']\n",
"ldf_data = dataobj.get_data(ldt_timestamps, ls_symbols, ls_keys)\n",
"d_data = dict(zip(ls_keys, ldf_data))"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for s_key in ls_keys:\n",
" d_data[s_key] = d_data[s_key].fillna(method='ffill')\n",
" d_data[s_key] = d_data[s_key].fillna(method='bfill')\n",
" d_data[s_key] = d_data[s_key].fillna(1.0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Creating an Event Matrix\n",
"\n",
"An Event Matrix is a Pandas DataFrame. For each equity for each date, we indicate whether an event occurred or not. A NaN indicates no event for that equity/date. A 1 indicates that an event occurred. Here's an example:\n",
"\n",
"|Date|IBM |GOOG|XOM |MSFT|GS |JP |\n",
"|----|----|----|----|----|----|----|\n",
"|(d1)|nan |nan | 1 |nan |nan | 1 |\n",
"|(d2)|nan | 1 |nan |nan |nan |nan |\n",
"|(d3)| 1 |nan | 1 |nan | 1 |nan |\n",
"|(d4)|nan | 1 |nan | 1 |nan |nan |\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df_events = find_events(ls_symbols, d_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following line shows the first 5 lines in df_events."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>A</th>\n",
" <th>AA</th>\n",
" <th>AAPL</th>\n",
" <th>ABC</th>\n",
" <th>ABT</th>\n",
" <th>ACE</th>\n",
" <th>ACN</th>\n",
" <th>ADBE</th>\n",
" <th>ADI</th>\n",
" <th>ADM</th>\n",
" <th>...</th>\n",
" <th>XLNX</th>\n",
" <th>XOM</th>\n",
" <th>XRAY</th>\n",
" <th>XRX</th>\n",
" <th>XYL</th>\n",
" <th>YHOO</th>\n",
" <th>YUM</th>\n",
" <th>ZION</th>\n",
" <th>ZMH</th>\n",
" <th>SPY</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2008-01-02 16:00:00</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008-01-03 16:00:00</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008-01-04 16:00:00</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008-01-07 16:00:00</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2008-01-08 16:00:00</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 502 columns</p>\n",
"</div>"
],
"text/plain": [
" A AA AAPL ABC ABT ACE ACN ADBE ADI ADM ... \\\n",
"2008-01-02 16:00:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... \n",
"2008-01-03 16:00:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... \n",
"2008-01-04 16:00:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... \n",
"2008-01-07 16:00:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... \n",
"2008-01-08 16:00:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... \n",
"\n",
" XLNX XOM XRAY XRX XYL YHOO YUM ZION ZMH SPY \n",
"2008-01-02 16:00:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2008-01-03 16:00:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2008-01-04 16:00:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2008-01-07 16:00:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2008-01-08 16:00:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
"[5 rows x 502 columns]"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_events.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plotting the event study\n",
"\n",
"The code below shows how to call the\n",
"event profiler once you have created\n",
"the event matrix using the findEvents\n",
"function. This code plots the event\n",
"profiler output in the file\n",
"MyEventStudy.pdf."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/fra/anaconda2/envs/QSTK/lib/python2.7/site-packages/pandas/indexes/base.py:2683: RuntimeWarning: Cannot compare type 'Timestamp' with type 'str', sort order is undefined for incomparable objects\n",
" return this.join(other, how=how, return_indexers=return_indexers)\n"
]
}
],
"source": [
"ep.eventprofiler(df_events, d_data, i_lookback=20, i_lookforward=20,\n",
" s_filename='MyEventStudy.pdf', b_market_neutral=True, b_errorbars=True,\n",
" s_market_sym='SPY')"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd8HOWdx/HPT80qlmzLlruxDRiwTceYkBhCbyG0QCgh\n1GBySS5wl8qRAwLpJAECJD4SwBBKgKMeJSEkMSUQXOjYGEwxNrgIbMuSLFllf/fHM7taC2m1KquV\n5O/79ZqXZmdmZ34z2p3fzvM884y5OyIiIgA52Q5ARET6DiUFERFJUFIQEZEEJQUREUlQUhARkQQl\nBRERSVBS6OPMbJKZuZnlZTuW1szsMjO7rRvvf93MDujBkCSDLLjZzNab2fxsxyOZoaTQQ8zsPTNr\nMLMRraa/GJ3UJ2Uhpnlm9pUU8+MJpyYa3jOz72colrlm9qPkae4+3d3nZWJ7A0FbxyzLZgGHAuPd\nfWaqBc3spuiztX3StHFm9qCZrTOzlWb21aR5+yV9DuODm9kXMrc7ndOXf6D1JCWFnvUucGr8hZnt\nAhR3dWW9+OEb6u6DgROB/zazQ3tpu1ut3vjfZmAbE4H33L22g+3OArZrY9ZthO/IKOBzwE/M7EAA\nd3/a3QfHB+BooAb4c0/ugKTB3TX0wAC8B/wAWJA07ZfAxYADk6JpnwNeBDYCK4DLkpafFC17LvA+\n8FTStLxomS9E29o5ev0p4FlgA/AycEA0/cdAM1BP+HJd10bMW6w7mjYf+E7S67HAvUAl4Qv9zaR5\nlwG3Jb2+B1gNVEWxT4+mzwYagYYolv9LOmaHRNuoA8qT1rUH8BGQH70+B1gCrAf+Akxs5/8Q36ez\no+O7HvgqsDfwSnScrmv1nnbXDVwTrWcjsAjYr9X+3w3cClQDrwMzUnxGHPg68BbwbjRtJ+CvwDpg\nKfDFDo6ZA9snrXMu8KNo/ABgJfC96P/wx6Rp3wLWAquAs1PEOBZ4KIpnGXBeNP3c6LPUHMXzw3be\nn0f4fO+aHCswOHo9MmnZG4A/trOem4GbU8Q5iPD9eh9YA8wBiqJ5S4CjW8VUCeyZ6jsTzZsHXAH8\nM/qfPg6MiOa9H+1DTTTsC2wPPEn4zH8E3JXtc1F3h6wHMFAGWk5wS4GpQG70ZZzIlknhAGAXwlXa\nrtEH+rho3qRo2VuBEqAoaVoe4US3LOmLNg74GDgqWt+h0euKaP484CspYk6sO3r9KWATcHz0Oodw\nIrwEKAC2Bd4BDo/mX8aWSeEcoDT6wl4NvJQ0by7Ryav1MYvG/050AopeXwnMicaPjfZ7anQcfgA8\n28E+zQEKgcMIJ7MHgJHRMVsLfDaddQOnA8Ojed8inGwLk/a/Pjr+ucBPgX+lON5OSADl0f+2hJBw\nzo7WH0+E01Ics46SQhPw8+h/UJQ07XIgP4p1EzCsnRifAn4bHbvdCSfTg6J5ZwHPdPA9+A5wTetY\no89F66Twe+DFNtZRQjghH5BiO1cRkld5tO7/A34azbsEuD1p2c8BSzrxnXkb2CE6fvOAn7X1fYmm\n3Un44ZcTHbNZ2T4XdXfIegADZaAlKfwgOjkcEZ0A8khKCm2872rgqmg8/qHbNml+fNq3gcWE8tz4\nvO/R6pcW4ZfumdH4PNJLChsIv9Sd8OvLovn7AO+3es9FRL/gaJUUWi03NFrfkOj1XFInha8Af4/G\njXCy3D96/RhwbtL7cggntokp9mlc0rSPgZOTXt8LXNjZdUfz1wO7Je3/E0nzpgF1KY63E51go9cn\nA0+3WuZ/gEtTHLOOkkIDUdJKmlbHlieytcCn2ohvAuFKoDRp2k+BudH4WaRICtH7lyX9z1vH+gxw\nLeHkuSfR1VEb6/ky4arU2tmOAbXAdknT9qXl6mt7QlIpjl7fDlzSie/MD5LmfQ34c6vPVvKxvJVw\nxTO+rVj746A6hZ73R+A0whfo1tYzzWwfM/uHmVWaWRWhaGNEq8VWtLHe7wDXu/vKpGkTgZPMbEN8\nIFQGjulkzCMIl/ffIpxE8pPWP7bV+v+LUCbcer9yzexnZva2mW0knPDj607HvcC+ZjYG2B+IAU8n\nxXFNUgzrCCeGcSnWtyZpvK6N14PTWbeZfdvMlphZVTR/SKt9Wp00vgko7KAsP/l/OxHYp9Xx/RIw\nOsX7O1Lp7vWtpn3s7k2t4hzMJ40F1rl7ddK05aQ+zsmuBi5396p25n8JmEw4Br8j1DGsbGO5M4Fb\nPTrrtqGCUFe3KOm4/TmajrsvIxQhfd7MioFjgDui96bznWn9P23rWMV9l/B5mR+1pjsnxbL9woCu\nRc8Gd19uZu8SLk/PbWORO4DrgCPdvd7MruaTJ862vgyHAX82s9Xufm80bQXhV8957YXTibibgV+b\n2QmEX0dXR+t/192npLGK0whFMYcQEsIQwq9qSycWd19vZo8Tfj1PBf6UdFJYAfzY3W9Pd386od11\nm9l+hC/9wcDr7h4zs+R96ork47ACeNLd26vYb+uYbWLLxguj2fLEmvb/vA0fAuVmVpqUGLYBPkjz\n/QcDs8zsF0nTnjOzC9z9DndfTqhABsDM7iDUYZE0bQLhh8n5KbbzESGxT3f39mK7k9DoIwdYHCUK\n6Pg7k8onjq27rwbOi2KfBTxhZk8lba/f0ZVCZpxLKCZoq5VGKeHXWL2ZzSScTNPxOqFI6nozOyaa\ndhvh19Dh0S/1QjM7wMzGR/PXEOoBOuNnwHfNrJDwha02s++ZWVG0jZ3NbO929mszoaimGPhJq/np\nxHIHcAahFdQdSdPnABeZ2XQAMxtiZid1cr/ak2rdpYTy+Eogz8wuAcp6aLsADwM7mNmXzSw/GvY2\ns6nR/LaO2UvAadH/4gjgsz0VjLuvIFTA/jT6LO1K+Cyney/KDsBuhLqI3aNpnwfuBzCzqWZWamYF\nZnY64YfOr1ut48uEOp23U8QZI9RHXGVmI6N1jzOzw5MW+1O0/n9jy89SR9+ZVCoJV7CJ/4mZnZT0\n3vWExBFLY119lpJCBrj72+6+sJ3ZXwMuN7NqQoXY3Z1Y78uEX1q/N7Mjoy/xsYQinUrCr6Dv0PJ/\nvQY40cLNRr9JczOPED7c50VXD0cTvuDvEn6h/YFwFdDarYSihg8IdR//ajX/RmBadMn+QDvbfgiY\nAqyO9jW+3/cTKk//FBVNvQYcmeb+pNTBuv9CKJZ4M9q3etou2uvqtqsJJ65TCL/SV9NSSQxtH7ML\nCCfaeFFTe8eyq04llJ1/SDiZX+ruT6TzRndf6+6r40M0+SN3r4vGDyc0VIi3CDvC3StbreYM4JY0\nNvc9Qv3Fv6L/2xPAjkmxrAKeAz4N3JU0vaPvTKr920Ro1ffP6H/yKUKrtufNrIbw+b3A3d9JI/4+\nK16hKCIioisFERFpoaQgIiIJSgoiIpKgpCAiIgn97j6FESNG+KRJk7IdhohIv7Jo0aKP3L2io+X6\nXVKYNGkSCxe219pTRETaYmbL01lOxUciIpKgpCAiIglKCiIikqCkICIiCUoKIiKSoKQgIiIJSgoi\nIpKgpCAiIglKCiIifdx774WhNygpiIhIgpKCiEiG9eYv/e5SUhAR6ed6MukoKYiISIKSgohIN3X3\nl3pfKl5SUhARkYSMJQUzu8nM1prZa+3MP9bMXjGzl8xsoZnNylQsIiKSnkxeKcwFjkgx/2/Abu6+\nO3AO8IcMxiIiImnIWFJw96eAdSnm17i7Ry9LAG9vWRER6R1ZrVMws+PN7A3gEcLVQnvLzY6KmBZW\nVlb2XoAiIluZrCYFd7/f3XcCjgOuSLHcDe4+w91nVFR0+NxpERHpoj7R+igqatrWzEZkOxYRka1Z\n1pKCmW1vZhaN7wkMAj7OVjwiIgJ5mVqxmd0JHACMMLOVwKVAPoC7zwG+AJxhZo1AHXByUsWziIhk\nQcaSgruf2sH8nwM/z9T2RUSk8/pEnYKIiPQNSgoiIpKgpCAiIglKCiLS73XUy2hf6oW0r1NSEBHp\nwNaUVJQURGSrtzWd9DuipCAiWafin75DSUFERBKUFEREJEFJQUREEpQUREQkQUlBREQSlBRERCRB\nSUFERBKUFEREJEFJQUREEpQUREQkQUlBRDJO3VT0H0oKIiKSoKQgIiIJSgoiIpKgpCAiIglKCiIi\nkqCkICIiCUoKIiKSkLGkYGY3mdlaM3utnflfMrNXzOxVM3vWzHbLVCwiIpKeTF4pzAWOSDH/XeCz\n7r4LcAVwQwZjERGRNORlasXu/pSZTUox/9mkl/8Cxndne2vWwFe/CrvuCrvsEv5utx3k5nZnrSIi\nW5eMJYVOOhd4rL2ZZjYbmA2wzTbbtLnMyy/DAw+EIa6oCKZP3zJR7L47lJf3aOwiIgNG1pOCmR1I\nSAqz2lvG3W8gKl6aMWOGt7XMK698clpdHSxcGIaW7cFnPwsnnQQnnACjR6cf66ZN4A4lJem/R0Sk\nP8lqUjCzXYE/AEe6+8fdWdcXvgAjR8Krr4YE8eqrsGrVJ5dzh3nzwvCNb7SfIBoawnoWLID588Pf\nJUvCvP33D8sffzyM71ahl4hI35K1pGBm2wD3AV929ze7u77Jk8OQrLIyJId4onj5ZXjhhZAY4JMJ\nYv/9Ydo0WLQIXnopJIa2xN/zzW/CPvuEhHTCCaEOQ2RrFO8BddKkbEYhPSFjScHM7gQOAEaY2Urg\nUiAfwN3nAJcAw4HfmhlAk7vP6MkYKirgoIPCELd6Ndx7L9xzDzz11JYJ4sknw9CenJywnCcVYD3/\nfBi++91QZ3HiiXDGGTBxYk/uiYhI78hk66NTO5j/FeArmdp+e0aPhq9/PQztJYi4bbeFvfeGmTPD\n3z33hI0b4cEHw/v+8Q9obm5Z/pVXwnDppXDIIXDuuXDccTBoUO/uo4hIV2W9ojmbkhPEqlXw0EOw\nfn1ooTRjBowY8cn3lJSEpq9f/SqsWxfec9998PjjsHlzWMYd/vrXMJSXw+mnwznnwG4Zuj1v9eqQ\noJ5+GmIxmDo1FINNmwZjx4bKdRGRdHSYFMzsM8BL7l5rZqcDewLXuPvyjEfXi8aMgfPP79x7ysvh\nrLPCUF0NDz8Mc+eGZBC/6li3Dn7zmzDstReccgrsvDNMmRKKmPK6kJbXrQvFXH//exgWL25/2bKy\nlgQxbRocdlhonivSGaoz2Hqkc0r6HbBb1A3FtwithW4FPpvJwPqb0lI49dQwLF8eksPNN4fxuEWL\nwhCXnx8qp3fYIQxTpoREs2lTaE67adOWQ01NqCh/8cVPFnW1Z+NG+Ne/whB39dVwwQU9stsiMsCk\nkxSa3N3N7FjgOne/0czOzXRg/dnEiaFe4b//O/ySv/FGuP/+luKluMZGeOONMHRHQQHsu2+oUB88\nODSdXbwYXn8dqqo+ufyFF8LHH8MPf6iiJRHZUjpJodrMLgJOB/Y3sxyiVkSSWk5OqHA+5JBQ5HP3\n3eGX/ptvhqGt+yjSXe/ee7e0rPr0p6G4+JPLuYf6hsWLw3DbbeGeC4Arrmgp2spRX7kiEkknKZwM\nnAac6+6ro/sLrsxsWANPeXmonE5WXQ3LlrUkiTffhNraUJldXByGoqKW8eJimDABZs2CIUM63qZZ\nqCsZMwYOPji0hjrxRHgs6lDk+utDxfrcuaEoS7ZeqjOQuA6TgruvBn6d9Pp9Qp2CdFNpKeyxRxh6\nQ3Fx6BvqrLPgzjvDtDvugA0bQrPctq42RGTr0mHBgZmdYGZvmVmVmW00s2oz29gbwUnPKygIxUhf\n+1rLtEcfhcMPD8lBRLZu6ZQm/wI4xt2HuHuZu5e6e1mmA5PMycmB666DH/ygZdozz8ABB4QuyKX/\nee+9liIgke5IJymscfclGY9EepVZqGy+6qqWaS+/HCqwf/pTWLkye7FJ23Til96QTlJYaGZ3mdmp\nUVHSCWZ2QsYjk15x4YWhojn+MKIVK+C//gu22QYOPTQUNdXWZjVEEelF6bQ+KgM2AYclTXNCD6cy\nAJx5JgwdGiqg4/UK7vDEE2EYPDi0WjrzzNCTrJqwigxcKZOCmeUCr7j7VamWk/7v2GNDkdF998Gt\nt8Lf/tZy13RNTbiamDs3NJedODFcSST/jY+PHAmFhelts6YmXJmsWAHvvx/uqdh2W/j850PLLOk5\nanIq6UqZFNy92cxOBZQUtgIlJfDlL4dhxYpQdHTLLbB0acsytbUtN8O1p6Ag9Lk0ZEgY4uOlpeG+\niHgiWL++7fcXFYXEcOqpcOSR6mVWpDelU3z0TzO7DrgLSJQuu/sLGYtKsm7CBLjoIvj+98NT5265\nJdyR/dFHHb+3oSEsl86ybamrC9u6++6QTE44AU47DQ48sKXuQ0QyI52ksHv09/KkaQ4c1MayMsCY\nhedJzJwZmrGuXx+KepYvD0N8/P33w/Dxx6FPp3QUFITkEx+GDw/FVq++2rJMVVXoWPDmm2HUqNCl\n+dChYRgyZMu/w4aFnmjLyzNzLES2Bunc0XxgbwQifZ9ZOOGWl4dnTrTFPXT8V1UVemht/besrCUJ\nVFS0XWn92mvhjus774R3322ZvmYNPPJI6hiLi8PzMb797VC/ISKdk87zFC5pa7q7X97WdNm6mYWK\n5sLC8Mu+K3beGX78Y/jRj0IHfnfcAXfdld6NdZs2wZVXhn6dlBxEOi+d4qPkVuqFwNGAbmaTjDOD\nffYJw69/HZ5FsXp1aDZbVRX+Jo8vXhy6DYctk8M3vhGSQ0VFdvdHpD9Ip/joV8mvzeyXwF8yFpFI\nG3JzQ71GKrFYeH72ZZeFZ2VDSA6/+EWoD1FyEOlYV25DKgbG93QgIt2VkwPHHx+eTHfffbDrri3z\n4slh8uRwx/bHH2cvzvaoGwvpC9LpJfVVM3slGl4HlgLXZD40ka5JTg733rtlcqitDX07TZ4Ml1zS\n/r0SIlurdK4UjgY+Hw2HAWPd/dqMRiXSA3Jywj0O8eSw884t86qrQ4eAkyfD5Ze3/djSOHeorAwP\nQYrFMh+3SDalkxR+5O7Lo+EDd28ysz9mPDKRHhJPDi+/HG6Imzq1ZV5VVXie9uTJocXTPfeECuqv\nfx0+9zmYPj30/TRyJOy4I+y3HzQ3Z29fRDItndZH05NfmFkesFdmwhHJnJwcOOmkkCDuvjtUSL/5\nZpi3fv2Wz5doz7PPhuds7713RkMVyZp2rxTM7CIzqwZ2TXriWjWwBniwoxWb2U1mttbMXmtn/k5m\n9pyZbTazb3d5D0Q6KTc39Kv0+uuh87/ttuv4PWYt4wsWZC42kWxrNym4+0/dvRS4MumJa6XuPtzd\nL0pj3XOBI1LMXwd8E/hlpyIW6SF5eaHzvyVL4MYbQ+d7xxwD3/xmuC/ivvvCVcG6dfDLpE/p/PnZ\ni1kk09IpPrrYzE4HJrv7FWY2ARjj7im/Gu7+lJlNSjF/LbDWzD7XmYBFelp+PpxzThjas88+LeNK\nCjKQpVPRfD2wL3Ba9LommtZrzGy2mS00s4WVlZW9uWkRAPbYo6WH1jfeCP04iQxE6SSFfdz960A9\ngLuvBwoyGlUr7n6Du89w9xkVuh1VsqC4uKVJq3vockNkIEonKTRGT2BzADOrANRaW7Y6yd1sdKUI\nSXcsS3+QTlL4DXA/MNLMfgw8A/wko1GJ9EHdTQoi/UE6HeLdbmaLgIMBA45z9w57STWzO4EDgBFm\nthK4FMiP1jnHzEYDC4EyIGZmFwLT3F2ltdInJd+boGapMlCl0/oId38DeAPAzIaa2cXu/uMO3nNq\nB/NXo471pB+ZPj08P7quLjxjetUqGDMm21GJ9KxUN69NMLMbzOxhM/uKmZWY2a+ANwE9tkS2Onl5\n4XGfcbpakIEoVZ3CrcCHwLWEri4WAmOBXd39gl6ITaTPSa5XUFKQgShV8VG5u18Wjf/FzE4CvuTu\nankkW63kegVVNstAlLJOwcyGESqXAT4GhpiFXmDcfV2GYxPpc1q3QHLfsl8kkf4uVVIYAiyiJSkA\nvBD9dWDbTAUl0ldNngzDh4cnt23YAMuWwZQp2Y5KpOe0mxTcfVIvxiHSL5iFq4XHHguvFyxQUpCB\npSvPaBbZqqleQQYyJQWRTtKdzTKQKSmIdFLylcKLL0JjY/ZiEelpaSUFM5tlZmdH4xVmNjmzYYn0\nXSNHwqRJYby+Hl5r89mCIv1Th91cmNmlwAxgR+BmQv9FtwGfyWxoIn3X3nu39Hg6f3543oL0jubm\n0MXIypWhu5GVK8OjVevrYffdYaedYMcdQ0uxvLQ68pFk6Ryy44E9iJqjuvuHZlaa0ahE+riZM+Ge\ne8L4/Plw/vnZjWegicVg+fJwsl+8GJ5/Ht5dHqNyfTNr1zfiuU3kDGrCBoW/OQVNWG6M+1/IJ1ZX\nQKyugJzGAiaNLWDqlFxGj4YddoBTToHRo7O9d31bOkmhwd3dzOLPUyjJcEwifZ66u+g57vDqq/DP\nf4YrgNcWx3hzeQObbTO5xQ3kFDWQW9JATmEjjIGipE4IvSmHWEMevjmPWEMeOYUN5A/bBOF0xSrg\nww9yaV5WQOwvBXznihJ2266Yo4/K4XOfC31Z5fRAzWpVVbhyrKwMzZbjNzTGx1etgrIymDixZ292\nbGoK637xRVi9Gg46KFwldUc6SeFuM/sfYKiZnQecA/y+e5sV6d/23DOcTGKx8Gu2pgYGD852VP3L\nhg1w++1wwx+aeWNVDXnlNeHkP6iR3B2gGMCN5k0FNFcX0rCmjNjmPLwhj2GD8xk/KpcJ43KZMAFK\nSmDQoHBT4ZI3nDffbWTNhsaQUIoayCluIH9kNQVjqlgWM355TxE/vWEww/JKOPLgfPbeG/bbr/P7\nsHgx/OrXzp0P1BErrP/EfPeWDOCNuVQUF7H/vvnsvz/svz9MnZo6Ka1bB2+9Bc8+Cx98AJs2hb8r\nP4zxYWUTH1U1YfnhSsmbc7iieijf/W7n9yNZOs9T+KWZHQpsJNQrXOLuf+3eZkX6t8GDYdq0UMkc\ni8ELL4QvuaTmDs88Azf83rnvsXp86EbyR1RTtH2MWH1+4uTfvKmAYUWDmLpdPjt/2hg9GrbbDvbZ\nB8aNg8LCLdcbr98JDQAMKKC6uoClS0tYuhSeew4WLIrx0pJ6cobUkD+slqJt11IP3PtKAX+aV4L/\ndwmz9iziuGONY46BbbZpfx/+8Q/45a+cJ+bXMGjcegp2+mRCaEst8MiyPB58oYjmHxZTmlPEZ2bm\ns8vOxqhR4Yrjrbdg6Zsxlq1opKquMSS1wkZyChuxgqiobFAMxkNJ0sMHmjYW8cEHQzvz72hTOhXN\n/wncpUQgsqWZM1taHs2fr6SQSmUl3H8/3PtAM+9t2EjB6Cryd2zAm3No/KgU1pdx6KxCDj/MmDYt\nPLsi+XHsW57001NaCjNmhOEznwHIYejQYh5/vJhHHoFH/9bARq8lf1gtg8ZugHHrWVCdy7O/KeE/\nLyth+sRijjsml2OOgaFDQ1HNHXfAlb9qZvHqjQwau4HiHRuJ1eVT9/ZIxg4uZdiQsG336PnF0fjm\nzfDhR41szq0nr6yO/KGbKKiopgmYtyqXJ5YWEWvICwmgqJGcQY0wCeJl9d6YS2xzPrH6ApqqivGG\nvMRVU3lZHiOG5jK6Ipfp07v+P4pLp/ioFHjczNYBdwH3uPua7m9apH+bORNuuimMq15hS+6wZAk8\n+CA88FCMF97cRMGIavKH11BU7jTXFFK3bBQ7jRnM7Atz2W+/UObemZN+VwwdCl/8YhiamwtYsKCA\nRx4Zxn0PNvPWh5vIK68lv7yWgpEbedeNK+8u5idzShhREMoG19kGCkZvoGhyjKaNRdS/W8FR+5Vw\n+kXGXnuFFk9tee89aG7OpaqqkKefHsqTTzlPP9/IxqY6csvqyBtSR17uJmL1BTRvLKShroxYfT75\nsQImj8tn/JhQTDZ9erhSig9jxkBBQdeSZnvSKT76IfBDM9sVOBl40sxWuvsh3d+8SP/VW91dfPQR\n3HorPPJIeD1sWCg+KSoKfwsLQ3PMkhI44YQQV1crM5ubobY21JHE/9bUwNtvQ0ND6Odp6NCWoawM\ncnNb3vv001EieLiJ99fXkj+8lryhtZRMdbwph81rhpBfU8ZpxxVy3nmhotes5aTWm3Jz4VOfCsO5\n5+by4YelvPRSKQ886Dy9qA7Kaskvr6Fou1pqWQtuDDKn8ePB8NEwzjypiP/4j3BM0ok/NzfURe25\nJ1xwgeFewBtvFPD000N47LFwvHf5TFjflCmhtdS4caHOoSdP+h3pTCvetcBqQhfaevKabPV22SVU\nbm7e3NLyJLnIoztiMZg3L5S9P/TXOhheRX55bZhZY6ECM2Z4zCCWE/4253DVLSVsM7SUL52cy5e+\nlLqzPvdQUfroo/C/9zqL39lMfUMMcmNYTgzL9TCeG8NyHHJieHMO3pSLN+XgzTnQlEtJUQ4lhbnU\n1cfYlFtLXnkteSPqKB4Bsc15NKwZQvOGEvaYUsz5Fxtf/GLfrJQfOxY+/Wn42teMqqpi/vznYh58\naASP/a2BuvxaLDdGadMQvnV+Pv/2bzBiRPe2ZxYqmqdOhcMOC9N646TfkXTqFL4GfBGoAO4BznP3\nxZkOTKSvy88Pv/qeey68XrAAjjqqe+usrIS77oLf39zEypqNFIzaSMFOLWXv3pQDOR5O2jkejYe/\nOYWNFG23lkqvDMUe15ey+3aDOf20HPbdNySs2tpQSfroo/Do402sqqklb1gteUM3kbtDjHbbm8dC\nIrLctp+xFaUrCoHm2kHUvz+c/PoSDtt/EMd909h553CF0xdOeukYMgROPhlOPtlobBzEvfcOYvPm\nUOxUVJTt6DIrnSuFCcCF7v5SpoMR6W9mzmxJCvPndy0pNDXB44/Db6515i2oI3dEFfnDaygc4TRX\nF7LprVHssW0px56dw6hR4YRVVxeKjOLDqlXw/vvwxDOb2Vy0kfyKavLLa1nanMP3ry+h+fIydhhX\nxNsfbMYHh0SQO3ozRUCsIY/GylKaqoqJNeRSXJhDcWEOJUXG4OIcSopyyMsz8vOhqdnZsDFGVXWM\nqppmqjfFsLwYltcMwIjCYo45Mp9jj4UDD2xpJZSN4qGekp8fiphg4CcESJEUzKzM3TcCV0avy5Pn\n68lrIt1AGz3JAAAPnUlEQVSrV3j55VBXcPs9jWxgIwUjN1K4UyPelMvmVUMo3DSEs04axHnnwa67\npi5Xjs8bNWoQDz9cwW23j+DxZ+qwodXkj6imoKKaFUDBToAbTdWF1L83gsKmEg7fv4B9vmjst1/Y\nn7bazbds24DcaMinuRmqq0MrrKam0AKrJ24Gk+xJdaVwB3A04elrzpZPYNOT10To/OM5Kyvhvvvg\nlj82s+TDGgpGbSRvmzoKgaaqYurfH87MHQcz+7IcTjwRios7F09REZx0Epx0krFuXTH/+7/F3HZ7\nBc+9XkteWT3N1YVMGVPM0UfmctRRoQw9P7/lpN/ZE3pubqhwHj++a++XvifVk9eOjv6qR1SRdmy/\nfTgpbtgQ7qZ9771PNktsboaHH4arr3GefWUTecM3kj+8huIpTqwun/rlwynPKePzR+Rz4olw6KE9\nE1t5OcyeDbNn5/DMM6W89VYpBx0UuloQaU86Fc1/c/eDO5omsjWKP57z8cfD6/nzW5LCunVw441w\n/Q1NrN5cRcHoKop2asKbcmlYU0ZOdRnHHFrImT8xDjkk9PiZKePHh0EJQTqSqk6hkND9yAgzG0ZL\n8VEZMK6jFZvZTYTip7XuvnMb8w24BjgK2ASc5e4vdHoPRLJs7723TApTp8K118KdD9bhwzaQP7KG\nQnOa1hdT/04Fn5pewlkXh+KhsrLsxi7SWqorhfOBC4GxhHqFeFLYCFyXxrrnRsvd2s78I4Ep0bAP\n8Lvor0i/klyvcP1vY1z7xxoGjd1A3g71eHMOm1cPoaR+KKcdW8Cpp3at4zWR3mLunnoBs39392u7\ntHKzScDD7Vwp/A8wz93vjF4vBQ5w91Wp1llaWup77bVXV8IRyYjNm8t5ftHdDBqzgYLRVVh+M7G6\nAjZ/OJSCTasZN+YBKir+TmNjA/DJztzi6qM+1boyvzvv1fyBPx/gySefXOTuM9pfIkinm4trzWxn\nYBrh3pT49PauANI1DkguRV0ZTftEUjCz2cBsgEGDBnVzsyI9a9CgdRSVrCB/fBON64tpXF3K0LwF\nbDfufsrKXku0RtKznKU/SPdxnAcQksKjhGKfZ2i/WKjHufsNwA0AM2bM8Hnz5vXWpkXS8swz8Itf\nN7HHIXmcfz6MHXswsGVbjI76r+nO/EyuW/P7/3wAS7NDrHTuaD4R2A140d3PNrNRhGc0d9cHhLul\n48ZH00T6nVmzYNYsPRBY+r90bjWpc/cY0GRmZYSO8SZ08J50PAScYcGngKqO6hNERCSz0vlps9DM\nhhIewbkIqAGe6+hNZnYnodhphJmtBC4F8gHcfQ6hKOooYBmhSerZXYhfRER6UDoVzV+LRueY2Z+B\nMnd/JY33ndrBfAe+nlaUIiLSK1LdvLZnqnm60UxEZOBJdaXwqxTzHDioh2MREZEsS9Uh3oG9GYiI\niGRfOvcpnNHW9B64eU1ERPqYdFofJT1GhELCHTkv0Is3r4mISO9Ip/XRvye/jpqn/iljEYmISNZ0\n5TlJtYAevCMiMgClU6fwf4TWRhCSyDTg7kwGJSIi2ZFOncIvk8abgOXuvjJD8YiISBalU6fwJEDU\n71FeNF7u7usyHJuIiPSydIqPZgOXA/VAjPAENge2zWxoIiLS29IpPvoOsLO7f5TpYEREJLvSaX30\nNqEXUxERGeDSuVK4CHjWzJ4HNscnuvs3MxaViIhkRTpJ4X+AvwOvEuoURERkgEonKeS7+39mPBIR\nEcm6dOoUHjOz2WY2xszK40PGIxMRkV6XzpVC/AlqFyVNU5NUEZEBKJ2b19TPkYjIVkLPUxARkQQ9\nT0Gkl0yalO0IRDqm5ymIiEiCnqcgIiIJep6CiIgk6HkKIn2E6hykL2g3KZjZ9sCo+PMUkqZ/xswG\nufvbHa3czI4ArgFygT+4+89azR8G3ARsR+ia+xx3f63zuyEiIj0hVZ3C1cDGNqZvjOalZGa5wPXA\nkYQip1PNbFqrxf4LeMnddwXOICQQERHJklRJYZS7v9p6YjRtUhrrngksc/d33L2B0GLp2FbLTCN0\ntoe7vwFMMrNR6QQuIiI9L1VSGJpiXlEa6x4HrEh6vTKaluxl4AQAM5sJTATGt15R1PfSQjNbWFlZ\nmcamRQaeSZNU7yCZlyopLDSz81pPNLOvAIt6aPs/A4aa2UvAvwMvAs2tF3L3G9x9hrvPqKio6KFN\ni4hIa6laH10I3G9mX6IlCcwACoDj01j3B8CEpNfjo2kJ7r4ROBvAzAx4F3gnrchFJEFXENJT2k0K\n7r4G+LSZHQjsHE1+xN3/nua6FwBTzGwyIRmcApyWvEB0d/SmqM7hK8BTUaIQEZEsSKebi38A/+js\nit29ycy+AfyF0CT1Jnd/3cy+Gs2fA0wFbjEzB14Hzu3sdkSkY7qSkHSlc/Nal7n7o8CjrabNSRp/\nDtghkzGIiEj6MpoURKR/0JWExHWlQzwRERmglBRERCRBxUci0iEVL209dKUgIiIJSgoiIpKgpCAi\nIglKCiIikqCKZhHpNlVEDxy6UhARkQQlBRERSVBSEBGRBCUFERFJUFIQEZEEJQUREUlQUhARkQQl\nBRERSdDNayKScbq5rf/QlYKIiCToSkFE+jxdafQeXSmIiEiCrhREpN/TlUTPUVIQkazTSb3vUFIQ\nkQFPSSd9qlMQEZGEjCYFMzvCzJaa2TIz+34b84eY2f+Z2ctm9rqZnZ3JeEREJLWMFR+ZWS5wPXAo\nsBJYYGYPufvipMW+Dix298+bWQWw1Mxud/eGTMUlItKaipdaZPJKYSawzN3fiU7yfwKObbWMA6Vm\nZsBgYB3QlMGYREQkhUwmhXHAiqTXK6Npya4DpgIfAq8CF7h7LIMxiYhICtmuaD4ceAkYC+wOXGdm\nZa0XMrPZZrbQzBZWVlb2dowiIluNTCaFD4AJSa/HR9OSnQ3c58Ey4F1gp9Yrcvcb3H2Gu8+oqKjI\nWMAiIlu7TCaFBcAUM5tsZgXAKcBDrZZ5HzgYwMxGATsC72QwJhERSSFjrY/cvcnMvgH8BcgFbnL3\n183sq9H8OcAVwFwzexUw4Hvu/lGmYhIR6YqtqXVSRu9odvdHgUdbTZuTNP4hcFgmYxARkfRlu6JZ\nRET6ECUFERFJUFIQEZEEJQUREUlQUhARkQQlBRERSdBDdkREumkg3cegKwUREUnQlYKISD/Xk1cq\nSgoiIhnWn4qXlBRERLKsLyUN1SmIiEiCrhRERPq43ryS0JWCiIgkKCmIiEiCkoKIiCQoKYiISIKS\ngoiIJCgpiIhIgpKCiIgkKCmIiEiCkoKIiCSYu2c7hk4xs0pgeYpFRgAf9VI4XaH4ukfxdV1fjg0U\nX3d1FN9Ed6/oaCX9Lil0xMwWuvuMbMfRHsXXPYqv6/pybKD4uqun4lPxkYiIJCgpiIhIwkBMCjdk\nO4AOKL7uUXxd15djA8XXXT0S34CrUxARka4biFcKIiLSRUoKIiKSMGCSgpldaWZvmNkrZna/mQ1N\nmneRmS0zs6VmdniW4jvJzF43s5iZzUiaPsnM6szspWiY01dii+Zl/di1iucyM/sg6Xgdle2YAMzs\niOgYLTOz72c7ntbM7D0zezU6Zgv7QDw3mdlaM3staVq5mf3VzN6K/g7rY/H1ic+emU0ws3+Y2eLo\ne3tBNL1njp+7D4gBOAzIi8Z/Dvw8Gp8GvAwMAiYDbwO5WYhvKrAjMA+YkTR9EvBalo9de7H1iWPX\nKtbLgG9n+/PWKqbc6NhsCxREx2xatuNqFeN7wIhsx5EUz/7AnsmffeAXwPej8e/Hv8N9KL4+8dkD\nxgB7RuOlwJvRd7VHjt+AuVJw98fdvSl6+S9gfDR+LPAnd9/s7u8Cy4CZWYhvibsv7e3tpiNFbH3i\n2PUDM4Fl7v6OuzcAfyIcO2mHuz8FrGs1+Vjglmj8FuC4Xg0qSTvx9QnuvsrdX4jGq4ElwDh66PgN\nmKTQyjnAY9H4OGBF0ryV0bS+ZHJ0Ofqkme2X7WCS9NVj9+9RMeFN2SxiSNJXj1MyB54ws0VmNjvb\nwbRjlLuvisZXA6OyGUw7+tRnz8wmAXsAz9NDxy+vRyLrJWb2BDC6jVkXu/uD0TIXA03A7b0ZW7Tt\nDuNrwypgG3f/2Mz2Ah4ws+nuvrEPxJYVqWIFfgdcQTjJXQH8ivAjQFKb5e4fmNlI4K9m9kb0a7hP\ncnc3s77WXr5PffbMbDBwL3Chu280s8S87hy/fpUU3P2QVPPN7CzgaOBgjwrWgA+ACUmLjY+m9Xp8\n7bxnM7A5Gl9kZm8DOwA9WhnYldjoxWOXLN1Yzez3wMMZDicdWTlOneHuH0R/15rZ/YQir76WFNaY\n2Rh3X2VmY4C12Q4ombuviY9n+7NnZvmEhHC7u98XTe6R4zdgio/M7Ajgu8Ax7r4padZDwClmNsjM\nJgNTgPnZiLEtZlZhZrnR+LaE+N7JblQJfe7YRR/2uOOB19pbthctAKaY2WQzKwBOIRy7PsHMSsys\nND5OaJTRF45baw8BZ0bjZwJ97Qq2T3z2LFwS3AgscfdfJ83qmeOX7Zr0HqyRX0Yo130pGuYkzbuY\n0DpkKXBkluI7nlDWvBlYA/wlmv4F4PUo5heAz/eV2PrKsWsV6x+BV4FXoi/BmGzHFMV1FKEVyNuE\nIrmsx5QU27aEFlEvR5+1rMcH3EkoOm2MPnvnAsOBvwFvAU8A5X0svj7x2QNmEYqwXkk63x3VU8dP\n3VyIiEjCgCk+EhGR7lNSEBGRBCUFERFJUFIQEZEEJQUREUnoVzevifQ2M2smNEPMJ9wpfytwlbvH\nshqYSIYoKYikVufuuwNEXUTcAZQBl2Y1KpEMUfGRSJrcfS0wG/iGBZPM7GkzeyEaPg1gZreaWaKH\nSjO73cyONbPpZjY/6vzwFTObkq19EWmPbl4TScHMatx9cKtpGwjPn6gGYu5eH53g73T3GWb2WeA/\n3P04MxtCuON0CnAV8C93vz3qDiPX3et6d49EUlPxkUjX5QPXmdnuQDOhI0Pc/Ukz+62ZVRC6MbnX\n3ZvM7DngYjMbD9zn7m9lLXKRdqj4SKQTok4Lmwk9UP4Hoa+o3YAZhKeuxd0KnA6cDdwE4O53AMcA\ndcCjZnZQ70Uukh5dKYikKfrlPwe4zt09Khpa6e4xMzuT8FjOuLmEHmVXu/vi6P3bAu+4+2/MbBtg\nV+DvvboTIh1QUhBJrcjMXqKlSeofgXh3xb8F7jWzM4A/A7XxN7n7GjNbAjyQtK4vAl82s0bCk7F+\n0gvxi3SKKppFMsDMign3N+zp7lXZjkckXapTEOlhZnYI4WHq1yohSH+jKwUREUnQlYKIiCQoKYiI\nSIKSgoiIJCgpiIhIgpKCiIgk/D+8RIhS3sDAWwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fa258064350>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"eventprofiler2(df_events, d_data, i_lookback=20, i_lookforward=20,\n",
" s_filename='MyEventStudy.pdf', b_market_neutral=True, b_errorbars=True,\n",
" s_market_sym='SPY', show=True)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
backports-abc==0.5
backports.shutil-get-terminal-size==1.0.0
backports.ssl-match-hostname==3.4.0.2
configparser==3.5.0
cycler==0.10.0
decorator==4.0.11
enum34==1.1.6
functools32==3.2.3.post2
ipykernel==4.5.2
ipython==5.1.0
ipython-genutils==0.1.0
ipywidgets==5.2.2
Jinja2==2.9.4
jsonschema==2.5.1
jupyter==1.0.0
jupyter-client==4.4.0
jupyter-console==5.0.0
jupyter-core==4.2.1
MarkupSafe==0.23
matplotlib==2.0.0
mistune==0.7.3
nbconvert==4.2.0
nbformat==4.2.0
notebook==4.3.1
numpy==1.11.3
pandas==0.19.2
pathlib2==2.2.0
pexpect==4.2.1
pickleshare==0.7.4
prompt-toolkit==1.0.9
ptyprocess==0.5.1
pycairo==1.10.0
Pygments==2.1.3
pyparsing==2.1.4
python-dateutil==1.5
pytz==2016.10
pyzmq==16.0.2
QSTK==0.2.8
qtconsole==4.2.1
scandir==1.4
scikit-learn==0.18.1
scipy==0.18.1
simplegeneric==0.8.1
singledispatch==3.4.0.3
six==1.10.0
subprocess32==3.2.7
terminado==0.6
tornado==4.4.2
traitlets==4.3.1
wcwidth==0.1.7
widgetsnbextension==1.2.6
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment