Euronext Brussels(BEL20) INDEX analysis in python

Euronext Brussels(BEL20) INDEX is a european index. It consists of minimum 10 and maximum 20 companines.

df = yf.download('^BFX',
start='1985-01-01',
end='2021-08-13',
progress=False)

df = df.loc[:, ['Adj Close']]
df.rename(columns={'Adj Close':'adj_close'}, inplace=True)

df[['simple_rtn','log_rtn']].tail(20)
def realized_volatility(x):
 return np.sqrt(np.sum(x**2))
df_rv = df.groupby(pd.Grouper(freq='M')).apply(realized_volatility)
df_rv.rename(columns={'log_rtn''rv'}, inplace=True)
df_rv.rv = df_rv.rv * np.sqrt(12)
fig, ax = plt.subplots(21, sharex=True)
ax[0].plot(df)
ax[1].plot(df_rv)
[<matplotlib.lines.Line2D at 0x7f2509bbc510>,
 <matplotlib.lines.Line2D at 0x7f2509c550d0>,
 <matplotlib.lines.Line2D at 0x7f2509c552d0>]
BEL 20 PRICE
fig, ax = plt.subplots(31, figsize=(2420), sharex=True)
df.adj_close.plot(ax=ax[0])
ax[0].set(title = 'BFX time series',
ylabel = 'Stock price ($)')
df.simple_rtn.plot(ax=ax[1])
ax[1].set(ylabel = 'Simple returns (%)')
df.log_rtn.plot(ax=ax[2])
ax[2].set(xlabel = 'Date',
ylabel = 'Log returns (%)')
[Text(0, 0.5, 'Log returns (%)'), Text(0.5, 0, 'Date')]
BEL 20 log price
import cufflinks as cf
from plotly.offline import iplot, init_notebook_mode
init_notebook_mode()
df_rolling = df[['simple_rtn']].rolling(window=21) \
.agg(['mean''std'])
df_rolling.columns = df_rolling.columns.droplevel()
df_outliers = df.join(df_rolling)
def indentify_outliers(rown_sigmas=3):
   x = row['simple_rtn']
   mu = row['mean']
   sigma = row['std']
   if (x > mu + 3 * sigma) | (x < mu - 3 * sigma):
    return 1
   else:
    return 0
df_outliers['outlier'] = df_outliers.apply(indentify_outliers,
axis=1)
outliers = df_outliers.loc[df_outliers['outlier'] == 1,
['simple_rtn']]
fig, ax = plt.subplots()
ax.plot(df_outliers.index, df_outliers.simple_rtn,
color='blue', label='Normal')
ax.scatter(outliers.index, outliers.simple_rtn,
color='red', label='Anomaly')
ax.set_title("BFX returns")
ax.legend(loc='lower right')
<matplotlib.legend.Legend at 0x7f2505f4a690>
Bel 20 outliers
r_range = np.linspace(min(df.log_rtn), max(df.log_rtn), num=1000)
mu = df.log_rtn.mean()
sigma = df.log_rtn.std()
norm_pdf = scs.norm.pdf(r_range, loc=mu, scale=sigma)
fig, ax = plt.subplots(12, figsize=(168))
# histogram
sns.distplot(df.log_rtn, kde=False, norm_hist=True, ax=ax[0])
ax[0].set_title('Distribution of BFX returns', fontsize=16)
ax[0].plot(r_range, norm_pdf, 'g', lw=2,
label=f'N({mu:.2f}{sigma**2:.4f})')
ax[0].legend(loc='upper left');
df.log_rtn.plot(title='Daily BFX returns')
<matplotlib.axes._subplots.AxesSubplot at 0x7f2505ec8a90>
Bel 20 returns
df = yf.download(['^BFX''^VIX'],
start='1985-01-01',
end='2021-08-13',
progress=False)
df.tail()
df = df[['Adj Close']]
df.tail()
df.columns = df.columns.droplevel(0)
df = df.rename(columns={'^BFX''bfx''^VIX''vix'})
df['log_rtn'] = np.log(df.bfx / df.bfx.shift(1))
df['vol_rtn'] = np.log(df.vix / df.vix.shift(1))
df.dropna(how='any', axis=0, inplace=True)
corr_coeff = df.log_rtn.corr(df.vol_rtn)
ax = sns.regplot(x='log_rtn', y='vol_rtn', data=df,
line_kws={'color''red'})
ax.set(title=f'BFX vs. VIX ($\\rho$ = {corr_coeff:.2f})',
ylabel='VIX log returns',
xlabel='BFX log returns')
[Text(0, 0.5, 'VIX log returns'),
 Text(0.5, 0, 'BFX log returns'),
 Text(0.5, 1.0, 'BFX vs. VIX ($\\rho$ = -0.40)')]

Post a Comment

0 Comments