<jupyter_start><jupyter_text>Simulación de procesos financieros. **Nombres:** <NAME>**Fecha:** 07 de mayo del 2021.**Expediente** : if722627**Profesor:** <NAME>. Tarea 11: Clase: 32  Valuación opciones Tipo Barrera> Utilizar lo visto en la **Clase24_Valuación Opciones Barrera** para realizar valuación de opciones   Tarea: Realizar la valuación de las opciones barrera para las acciones de Microsoft, siguiendo los siguientes lineamientos:1. Realizar la valuación para el tipo de opción barrera 'CALL'- down-and-out, usando la suposición de rendimientos normales y usando el método del histograma. Para ambas valuaciones, comparar los resultados de la evaluación obtenida con los resultados obtenidos por la valuación Europea. Como se realizó en clase.2. Repetir el inciso anterior pero en esta ocasión para el caso de 'PUT'- Up-and-out.**Nota:** Analice los datos descargados y según el método ya sea `down-and-out` o `Up-and-out` defina un strike price usando la volatility smile vista en la clase de opciones europeas y basado en el spot price y el strike defina una barrera adecuada.  ``<NAME>``<jupyter_code>#importar los paquetes que se van a usar
import pandas as pd
import pandas_datareader.data as web
import numpy as np
from sklearn.neighbors import KernelDensity
import datetime
from datetime import datetime, timedelta
import scipy.stats as st
import scipy as sp
import scipy.optimize as optimize
import scipy.cluster.hierarchy as hac
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import date
%matplotlib inline
# Función para descargar precios de cierre ajustados:
def get_adj_closes(tickers, start_date=None, end_date=None):
    # Fecha inicio por defecto (start_date='2010-01-01') y fecha fin por defecto (end_date=today)
    # Descargamos DataFrame con todos los datos
    closes = web.DataReader(name=tickers, data_source='yahoo', start=start_date, end=end_date)
    # Solo necesitamos los precios ajustados en el cierre
    closes = closes['Adj Close']
    # Se ordenan los índices de manera ascendente
    closes.sort_index(inplace=True)
    return closes

####### Calculation of log-returns
def calc_daily_ret(closes):
    return np.log(closes/closes.shift(1)).dropna()<jupyter_output><empty_output><jupyter_text>'CALL'- down-and-out<jupyter_code>closes = get_adj_closes(['MSFT'], '2017-01-01')
closes_MSFT = closes.loc[:,'MSFT']
closes_MSFT
ret_MSFT = calc_daily_ret(closes_MSFT)

sigma = ret_MSFT.std()
r = (0.05/100)/360
sigma, r
MSFT = web.YahooOptions('MSFT')
MSFT_opt = MSFT.get_all_data().reset_index()
MSFT_opt.set_index('Expiry').sort_index()

MSFT_opt.loc[MSFT_opt.Expiry.apply(lambda x: (x.year == 2022) and (x.month == 6))]<jupyter_output><empty_output><jupyter_text>Volatility Smile<jupyter_code>call = MSFT_opt.loc[(MSFT_opt.Expiry== '2022-06-17') & (MSFT_opt.Type=='call')]
ax = call.set_index('Strike').loc[:, 'IV'].plot(figsize=(8,6)) # IV es implied volatility
ax.axvline(call.Underlying_Price.iloc[0], color='g'); # strike price del activo subyacente<jupyter_output><empty_output><jupyter_text>Utilizando el voilatility Smile, podemos determinar que el strike price será de 251.<jupyter_code>opt_deseada = MSFT_opt.loc[(MSFT_opt.Type=='call') & (MSFT_opt.Strike==250) & (MSFT_opt.Expiry=='2022-06-17')]
opt_deseada
opt_valuar = opt_deseada.loc[list(opt_deseada.index)[0]]
opt_valuar
opt_valuar['JSON']
# Datos de la opción y del día de actual
today = pd.Timestamp(date.today())
expiry = opt_valuar.Expiry

# Fechas desde el día de hoy hasta la fecha de cierre del contrato (considerando unicamente los días hábiles)
dates = pd.date_range(start = today, end = expiry, freq='B')

# Cantidad de escenarios a simular para el método de montecarlo
ndays = len(dates)
nscen = 10000

K = opt_valuar.Strike
S0 = 251

sim_ret = pd.DataFrame(sigma*np.random.randn(ndays,nscen)+r,index=dates)
sim_closes = S0*np.exp(sim_ret.cumsum())
K, S0
pd.set_option('display.max_columns', 15)

# Precio barrera
B = 200

# Si en algún momento el precio toca la barrera la opción se desactiva
I = (sim_closes > B).cumprod(axis=0) > 0
I
# Definir strike
strike = K
# Calcular la prima de una opción Europea
call = pd.DataFrame({'Prima Europea':np.exp(-r*ndays)*np.fmax(sim_closes - strike, 0)
                     .mean(axis=1)},index=dates)
# Calcular la prima de una opción barrera
callui = pd.DataFrame({'Prima up-and-in':np.exp(-r*ndays)*(I * np.fmax(sim_closes - strike, 0))
                       .mean(axis=1)},index=dates)
# Graficar el resultado de las dos primas previamente valuadas
ax = callui.plot();
call.plot(ax=ax);
call.iloc[-1]
callui.iloc[-1]<jupyter_output><empty_output><jupyter_text>CONCLUSIONEn caso de que no toque la barrera, como es una opción de tipo call, tendríamos la opción de comprar esa opción, pero si es que llega a tocar la barrera entonces perdemos esa opción y la prima, que se calculó de 35.82.   'PUT'- Up-and-out<jupyter_code>MSFT = web.YahooOptions('MSFT')
MSFT_opt = MSFT.get_all_data().reset_index()
MSFT_opt.set_index('Expiry').sort_index()

MSFT_opt.loc[MSFT_opt.Expiry.apply(lambda x: (x.year == 2023) and (x.month == 6))]<jupyter_output><empty_output><jupyter_text>Volatility Smile<jupyter_code>put = MSFT_opt.loc[(MSFT_opt.Expiry== '2023-06-16') & (MSFT_opt.Type=='put')]
ax = put.set_index('Strike').loc[:, 'IV'].plot(figsize=(8,6)) # IV es implied volatility
ax.axvline(put.Underlying_Price.iloc[0], color='g'); # strike price del activo subyacente
opt_deseada = MSFT_opt.loc[(MSFT_opt.Type=='put') & (MSFT_opt.Strike==300) & (MSFT_opt.Expiry=='2023-06-16')]
opt_deseada
opt_valuar = opt_deseada.loc[list(opt_deseada.index)[0]]
opt_valuar
opt_valuar['JSON']
# Datos de la opción y del día de actual
today = pd.Timestamp(date.today())
expiry = opt_valuar.Expiry

# Fechas desde el día de hoy hasta la fecha de cierre del contrato (considerando unicamente los días hábiles)
dates = pd.date_range(start = today, end = expiry, freq='B')

# Cantidad de escenarios a simular para el método de montecarlo
ndays = len(dates)
nscen = 10000

K = opt_valuar.Strike
S0 = 251

sim_ret = pd.DataFrame(sigma*np.random.randn(ndays,nscen)+r,index=dates)
sim_closes = S0*np.exp(sim_ret.cumsum())
K, S0
pd.set_option('display.max_columns', 15)

# Precio barrera
B = 360

# Si en algún momento el precio toca la barrera la opción se desactiva
I = (sim_closes < B).cumprod(axis = 0) > 0
I
# Definir strike
strike = K
# Calcular la prima de una opción Europea
put = pd.DataFrame({'Prima Europea':np.exp(-r*ndays)*np.fmax(strike - sim_closes, 0)
                     .mean(axis=1)},index=dates)
# Calcular la prima de una opción barrera
putui = pd.DataFrame({'Prima up-and-in':np.exp(-r*ndays)*(I * np.fmax(strike - sim_closes, 0))
                       .mean(axis=1)},index=dates)
# Graficar el resultado de las dos primas previamente valuadas
ax = putui.plot();
put.plot(ax=ax);
put.iloc[-1]
putui.iloc[-1]<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1198203419298754, 'fraction_numerical': 0.022747029846421327, 'mean_word_length': 5.241410488245931, 'pattern_counts': {'":': 0, '<': 29, '<?xml version=': 0, '>': 32, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '371104', 'license': 'MIT', 'n_tokens_mistral': 2720, 'n_tokens_neox': 2579, 'n_words': 681, 'path': 'Tarea11_CPerez.ipynb', 'repo_name': 'danielperhez/Tarea11_CPerez', 'size': '6971'}