Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用pandas在VaR(风险价值)中应用衰减因子_Python_Pandas - Fatal编程技术网

Python 如何使用pandas在VaR(风险价值)中应用衰减因子

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

我计算了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.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]