Troubled markets and volatility

Challenging financial models through an exploration on the crash of Argentina's ADRs

American Depositary Reciepts (ADRs) are financial instruments that allow US investors to purchase stocks in foreign companies. Argentina has a number of companies listed in US exchanges through ADRs.
In this notebook, we will explore the performance of these ADRs with a focus on the period from January to August 2019, where political uncertainty sent markets into turmoil: the country’s Merval stock index fell 48% in dollar terms in a single day, the second-largest one-day drop in any of the 94 markets tracked by Bloomberg since 1950[1], causing a 20% devaluation of the Argentine peso and a sharp drop in bond prices.
We will be looking at the end-of-day data of the Argentine ADRs, and their corresponding put and call options, to examine whether the daily log returns of stocks are distributed normally, a conclusion that follows from the standard model due to Bachelier.

In [1]:
%config InlineBackend.figure_format = 'retina'
%matplotlib inline

import os

import numpy as np
import pandas as pd
import warnings
from pandas.plotting import register_matplotlib_converters
import matplotlib.pyplot as plt
import seaborn as sns

In [2]:
sns.set(rc={'figure.figsize': (12,8)})

Data munging

In [3]:
data_dir = 'data/'
In [ ]:
tickers = [
    'BMA', 'BFR', 'CEPU', 'CRESY', 'EDN', 'GGAL', 'SUPV', 'IRS',
    'IRCP', 'LOMA', 'NTL', 'MELI', 'PAM', 'PZE', 'TEO', 'TS', 'TX',
    'TGS', 'YPF'

dfs = [pd.read_csv(os.path.join(data_dir, ticker.lower() + '.csv')) for ticker in tickers]

adrs_df = pd.concat(dfs, axis=0, ignore_index=False)
adrs_df.to_csv(os.path.join(data_dir, 'adrs.csv'), index=False)

Next we'll concatenate all options daily files into a csv.

In [ ]:
dfs = []

for root, dirs, files in os.walk(data_dir):
    if root.endswith('daily'):
        for file in files:
            df = pd.read_csv(os.path.join(root, file))
adr_options = pd.concat(dfs, axis=0)
adr_options.to_csv(os.path.join(data_dir, 'adr_options.csv'), index=False)


We begin our exploration of the end-of-day (EOD) data for Argentina's ADRs.

In [4]:
adrs_df = pd.read_csv(os.path.join(data_dir, 'adrs.csv'), index_col='date', parse_dates=['date'])
adrs_df.index = pd.DatetimeIndex(, name='date')
symbol close high low open volume adjClose adjHigh adjLow adjOpen adjVolume divCash splitFactor
2006-03-27 BMA 23.05 23.05 22.23 22.89 1065200 15.524521 15.524521 14.972239 15.416759 1065200 0.0 1.0
2006-03-28 BMA 22.38 22.47 21.90 22.47 1556100 15.073266 15.133883 14.749979 15.133883 1556100 0.0 1.0
2006-03-29 BMA 22.84 23.14 22.05 22.10 641300 15.383083 15.585138 14.851006 14.884682 641300 0.0 1.0
2006-03-30 BMA 22.75 23.10 22.70 23.00 293600 15.322467 15.558197 15.288791 15.490846 293600 0.0 1.0
2006-03-31 BMA 22.93 22.93 22.35 22.83 113600 15.443700 15.443700 15.053061 15.376348 113600 0.0 1.0

The data is indexed by date, with the symbol column holding the ticker name, and columns for the open and close prices (the price of the symbol at the start/end of the market day) and the high and low prices seen for the symbol at that date.
We'll begin plotting the adjusted close prices for each symbol (price adjusted for dividends payed and stock splits). The reset of the columns can be safely ingored for our purposes.

In [5]:
g = sns.relplot(x='date', y='adjClose', col='symbol', hue='symbol',
            facet_kws=dict(sharey=False, sharex=False), col_wrap=3, legend=False,
            kind='line', data=adrs_df.reset_index())

g.fig.suptitle("Daily ajusted close prices for Argentina's ADRs (USD)", size=16)