import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
# Load datasets
option_file_path = "data/spx_option_data.csv" # Update with your file path
treasury_file_path = "data/treasury_yield.csv"
df_options = pd.read_csv(option_file_path)
df_treasury = pd.read_csv(treasury_file_path)
# Compute box rates for each available maturity in the option dataset
maturity_groups = df_options.groupby('maturity')
box_rates = []
for maturity, group in maturity_groups:
X = group['strike']
y = group['put_price'] - group['call_price']
X = sm.add_constant(X) # Add intercept
model = sm.OLS(y, X).fit()
slope = model.params[1]
# Compute box rate and correctly annualize it: (R_T)^(360/T) - 1
R_T = 1 / slope
annualized_R_T = (R_T ** (360 / maturity)) - 1
box_rates.append({'maturity_days': maturity, 'box_rate': annualized_R_T * 100}) # Convert to percentage
# Convert to DataFrame
df_box_rates = pd.DataFrame(box_rates)
df_box_rates['maturity_months'] = df_box_rates['maturity_days'] / 30
# Plot the annualized box rate against maturity in months
plt.figure(figsize=(8, 5))
plt.plot(df_box_rates['maturity_months'], df_box_rates['box_rate'], marker='o', linestyle='-', label="Annualized Box Rate")
# Overlay the Treasury yield curve
plt.plot(df_treasury['months'], df_treasury['tbill_rate'], marker='s', linestyle='--', label="Treasury Yield")
plt.xlabel("Maturity (Months)")
plt.ylabel("Annualized Rate (%)")
plt.title("Annualized Box Rate vs. Treasury Yield Curve")
plt.legend()
plt.grid(True)
plt.show()