Portfolio Variance

$(a + b)^2=a^2+2ab+b^2$

$(w_1\sigma_1+w_2\sigma_2)^2=w^2_1\sigma^2_1+2w_1\sigma_1w_2\sigma_2\rho_{12}+w^2_2\sigma^2_2$

$\quad w_1+w_2=1$

$\sigma_1, \sigma_2\quad$ Standard deviations of two stocks

$\rho_{xy}\quad$ Correlation of two stocks

Calculating Portfolio Risk

In [19]:
import numpy as np
import pandas as pd
from pandas_datareader import data as wb
import matplotlib.pyplot as plt
In [20]:
tickers = ['PG', 'BEI.DE']

sec_data = pd.DataFrame()

for t in tickers:
    sec_data[t] = wb.DataReader(t, data_source='yahoo', start='2007-1-1')['Adj Close']

sec_returns = np.log(sec_data / sec_data.shift(1))

Equal weighting scheme:

In [21]:
weights = np.array([0.5, 0.5])

Portfolio Variance:

$(ab)^2 = a^2b^2$

$(a・B)^2 = a^TBa$

$\quad \quad \quad \quad \quad \quad w^T \quad \quad \quad \quad Cov \quad \quad \quad w$

$(w・Cov)^2=$ $\left[ \begin{matrix} w1 \: w2 \end{matrix} \right]$ $\left[ \begin{matrix} v(1) \: \: \: c(1, 2)\\ c(1,2) \: \: \: v(2) \end{matrix} \right]$ $\left[ \begin{matrix} w1 \\ w2 \end{matrix} \right]$ $= single \: number$

In [22]:
pfolio_var = np.dot(weights.T, np.dot(sec_returns.cov() * 250, weights))
pfolio_var
Out[22]:
0.026448788307083436

Portfolio Volatility:

In [23]:
pfolio_vol = (np.dot(weights.T, np.dot(sec_returns.cov() * 250, weights))) ** 0.5
pfolio_vol
Out[23]:
0.16263083442903267
In [24]:
print (str(round(pfolio_vol, 5) * 100) + ' %')
16.262999999999998 %