$(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
import numpy as np
import pandas as pd
from pandas_datareader import data as wb
import matplotlib.pyplot as plt
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))
weights = np.array([0.5, 0.5])
$(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$
pfolio_var = np.dot(weights.T, np.dot(sec_returns.cov() * 250, weights))
pfolio_var
pfolio_vol = (np.dot(weights.T, np.dot(sec_returns.cov() * 250, weights))) ** 0.5
pfolio_vol
print (str(round(pfolio_vol, 5) * 100) + ' %')