Python 如何使用pandas在VaR(风险价值)中应用衰减因子
我计算了4项资产的方差/协方差矩阵:Python 如何使用pandas在VaR(风险价值)中应用衰减因子,python,pandas,Python,Pandas,我计算了4项资产的方差/协方差矩阵: covariaances Symbol AAPL 0.000617 0.000124 0.000197 0.000290 DE 0.000124 0.000928 0.000144 0.000191 IBM 0.000197 0.000144 0.000570 0.000244 MSFT 0.000290 0.000191 0
covariaances
Symbol
AAPL 0.000617 0.000124 0.000197 0.000290
DE 0.000124 0.000928 0.000144 0.000191
IBM 0.000197 0.000144 0.000570 0.000244
MSFT 0.000290 0.000191 0.000244 0.000723
我使用的是153天的样本。我需要应用97%的衰减因子。我面临的问题是如何应用因子以及具体应用于什么变量。最初我认为这是返回,但这不能写入,因为我添加的天数越多,总VaR数越接近于零(该代码位于本问题的末尾,供参考)
我的原始数据帧的提取如下所示:
df.head()
Out[6]:
Date Symbol ClosingPrice Weight
0 2016-01-19 AAPL 93.905926 0.000694
1 2016-01-20 AAPL 91.860645 0.000694
2 2016-01-21 AAPL 93.355274 0.000694
3 2016-01-22 AAPL 96.728020 0.000694
4 2016-01-25 AAPL 97.553999 0.000694
df.tail()
Out[7]:
Date Symbol ClosingPrice Weight
603 2016-08-17 MSFT 57.23 0.00009
604 2016-08-18 MSFT 57.27 0.00009
605 2016-08-19 MSFT 57.20 0.00009
606 2016-08-22 MSFT 57.26 0.00009
607 2016-08-23 MSFT 57.85 0.00009
权重列是特定资产占整个总市值的百分比
我的完整代码如下(以防有帮助)
我尝试过这个方法,但认为我没有正确地实现这个因素(从概念上和实用上)
提前谢谢
约翰97%的衰减系数在什么时间段内?今天是100%,昨天是97%,前天是0.97^2),依此类推。总共153天,但可能或多或少。我有计算因子(retFac)的代码,只是不确定如何应用它。我想我应该权衡差异,但我不太确定该怎么做this@John为什么不使用原始数据帧执行操作:
today=pd.to_datetime('2016-08-31');df.ClosingPrice*=0.97**(今天-df.Date).dt.days
?如果你需要的话,也可以复制一下。我想我是想把衰减因子应用到标准化收益上,而不是价格上,我正在试图找出这一部分。衰减因子也适用于什么?。我还需要使用交易日(观察值),而不是从今天开始的日历日。97%的衰减系数在什么时间段内?今天的100%,昨天的97%,前一天的0.97^2),等等。总共153天,但可能或多或少。我有计算因子(retFac)的代码,只是不确定如何应用它。我想我应该权衡差异,但我不太确定该怎么做this@John为什么不使用原始数据帧执行操作:today=pd.to_datetime('2016-08-31');df.ClosingPrice*=0.97**(今天-df.Date).dt.days
?如果你需要的话,也可以复制一下。我想我是想把衰减因子应用到标准化收益上,而不是价格上,我正在试图找出这一部分。衰减因子也适用于什么?。我还需要使用交易日(观察),而不是从今天开始的日历日。
import numpy as np
import pandas as pd
import pandas.io.data as web
from scipy.stats import norm
import datetime as dt
Days = 3
Value=592e6 # $1,000,000
CI=0.9975 # set the confidence interval
decay = 0.97
df=pd.read_csv('CloseWeightsmini.csv')
df['Date'] = pd.to_datetime(df['Date'])
#df=df[df['Date'] > '2016-01-14']
df=df.drop_duplicates(['Date','Symbol'], keep='first')
df2=df.iloc[:,0:3].pivot('Date', 'Symbol', 'ClosingPrice')
df3=df.iloc[:,[1,3]].drop_duplicates().set_index('Symbol')
df4=df.iloc[:,[1,3]].drop_duplicates().reset_index(drop=True)
tickers=df4['Symbol']
numbers=len(tickers)
data=df2
ret=data/data.shift(1)-1 # calculate the simple returns
ret.fillna(0)
ret.mean()*Days #normalizes the returns over specified days
covariances=ret.cov()*Days #gives the covariance of returns over specified days
variances=np.diag(covariances) #extracts variances of the individual shares from covariance matrix
volatility=np.sqrt(variances) #gives standard deviation
weights=(df4['Weight'])
Pf_ret=np.sum(ret.mean()*(weights))*Days #Portfolio return
Pf_variance=np.dot(weights,np.dot(ret.cov()*Days,weights)) #Portfolio variance
Pf_volatility=np.sqrt(Pf_variance) #Portfolio standard deviation
USDvariance=np.square(Value)*Pf_variance
USDvolatility=np.sqrt(USDvariance)
covariance_asset_portfolio=np.dot(weights.T,covariances)
covUSD=np.multiply(covariance_asset_portfolio,Value)
beta=np.divide(covariance_asset_portfolio,Pf_variance)
fwrite=open("VAR.csv","w")
def VaR():
# this code calculates Portfolio Value-at-risk (Pf_VaR) in USD-terms and Individual Value-at-risk (IndividualVaR) of shares in portfolio.
Pf_VaR=norm.ppf(CI)*USDvolatility
IndividualVaR=np.multiply(volatility,Value*weights)*norm.ppf(CI)
IndividualVaR = [ '$%.2f' % elem for elem in IndividualVaR ]
fwrite.write('Portfolio VaR: ')
fwrite.write(str(Pf_VaR) + "\n")
print(Pf_VaR)
for i in range (min(len(tickers), len(IndividualVaR))):
fwrite.write("Individual Var: ")
fwrite.write(tickers[i]+" ")
fwrite.write(IndividualVaR[i] + "\n")
VaR() #call the function to get portfolio VaR and Individual VaR in USD-terms
def marginal_component_VaR():
# this code calculates Marginal Value-at-risk in USD-terms and Component Value-at-risk of shares in portfolio.
marginalVaR=np.divide(covUSD,USDvolatility)*norm.ppf(CI)
componentVaR=np.multiply(weights,beta)*USDvolatility*norm.ppf(CI)
marginalVaR = [ '%.5f' % elem for elem in marginalVaR ]
componentVaR=[ '$%.2f' % elem for elem in componentVaR ]
for i in range (min(len(tickers), len(marginalVaR))):
fwrite.write("Marginal Var: ")
fwrite.write(tickers[i]+" ")
fwrite.write(marginalVaR[i] + "\n")
for i in range (min(len(tickers), len(componentVaR))):
fwrite.write("Component Var: ")
fwrite.write(tickers[i]+" ")
fwrite.write(componentVaR[i] + "\n")
marginal_component_VaR() #call the function
datasave=data.tail(153)
datasave.to_csv('stockprice2.csv')
ret=data/data.shift(1)-1 # calculate the simple returns
retFac = np.fromfunction(lambda i,j : decay**(i), ret.values.shape)[::-1]
ret=ret*retFac
ret['ret_decay'] = retFac[:,0]