""" Name : c11_19_portfolio_VaR.py Book : Python for Finance (2nd ed.) Publisher: Packt Publishing Ltd. Author : Yuxing Yan Date : 6/6/2017 email : yany@canisius.edu paulyxy@hotmail.com """ import numpy as np import scipy as sp import pandas as pd from scipy.stats import norm from matplotlib.finance import quotes_historical_yahoo_ochl as getData # Step 1: input area tickers=('IBM','WMT','C') # tickers begdate=(2012,1,1) # beginning date enddate=(2016,12,31) # ending date weight=(0.2,0.5,0.3) # weights confidence_level=0.99 # confidence level position=5e6 # total value # z=norm.ppf(confidence_level) # Step 2: define a function def ret_f(ticker,begdate,enddte): x=getData(ticker,begdate,enddate,asobject=True,adjusted=True) ret=x.aclose[1:]/x.aclose[:-1]-1 d0=x.date[1:] return pd.DataFrame(ret,index=d0,columns=[ticker]) # Step 3 n=np.size(tickers) final=ret_f(tickers[0],begdate,enddate) for i in np.arange(1,n): a=ret_f(tickers[i],begdate,enddate) if i>0: final=pd.merge(final,a,left_index=True,right_index=True) # # Step 4: get porfolio returns portRet=sp.dot(final,weight) portStd=sp.std(portRet) portMean=sp.mean(portRet) VaR=position*(portMean-z*portStd) print("Holding=",position, "VaR=", round(VaR,2), "tomorrow") # compare total2=0.0 for i in np.arange(n): stock=tickers[i] ret=final[stock] position2=position*weight[i] mean=sp.mean(ret) std=sp.std(ret) VaR=position2*(mean-z*std) total2+=VaR print("For ", stock, "with a value of ", position2, "VaR=", round(VaR,2)) print("Sum of three VaR=",round(total2,2))