从两个数据框中计算加权股票回报率。

4

我有一个投资组合,包括7只股票,它们的信息存储在2个数据框中。

市值:

                 AAPL      GOOGL       AMZN     FB     IBM    MSFT        ORCL
2018-06-04  942870.9225 795721.6978 808033.8064 559683.8431 131306.1865 781150.6901 193175.0512
2018-06-05  950145.3268 795208.7988 823114.6586 558699.2999 131912.0456 785145.9528 192399.4117
2018-06-06  953438.4692 792862.4102 822823.5225 554066.1556 132839.1936 787450.9121 194930.4458
2018-06-07  950882.5975 783977.2272 819693.8089 544915.6954 133435.8730 775080.9641 194644.6838
2018-06-08  942231.9546 782312.8482 817117.2541 547579.7534 134151.8882 780843.3622 196685.8403

以及投资组合股票价格:

                AAPL       FB        GOOG        AMZN        IBM         MSFT        ORCL


2018-06-04  189.6813    193.28  1139.29 1665.27 136.5008    100.4157    46.5525
2018-06-05  191.1447    192.94  1139.66 1696.35 137.1307    100.9293    46.3656
2018-06-06  191.8072    191.34  1136.88 1695.75 138.0945    101.2256    46.9755
2018-06-07  191.2930    188.18  1123.86 1689.30 138.7148    99.6354 46.9067

我想计算每日加权平均组合收益率,权重为各个股票市值占总市值的比例。

例如,加权收益率应为:

sum(股票i收益率 * 股票i市值)/sum(股票市值)

如何生成一个包含整个期间每日收益率的新数据框?


2
你能添加你期望的输出吗? - ALollz
你不应该提供你的投资组合中每只股票的权重吗?除非你的投资组合本质上是一只大型科技ETF。 - kerwei
什么是“股票回报率i”? - zero
收益率被定义为Pt/Pt-1-1。例如,如果3天的价格分别为100、110和120美元,则可以计算出2个收益率(110/100-1=10%和120/110-1)。我想要一个数据框,显示t天内每日加权收益率(因此将有t-1行数据)。每日组合收益率是7只股票的加权平均收益率------average(stockreturn 1 +stockreturn 2 +...+ stockreturn 7)。而特定一日的权重是该日的市值,这些市值在第一个数据框中给出�� - JAKE
1个回答

0

不确定我是否理解你的意思,但是这个怎么样:

import pandas as pd

pd.set_option('display.max_columns',30)
pd.set_option('display.width',1000)
pd.set_option('precision', 4)

mc="""date         AAPL        GOOG        AMZN          FB         IBM        MSFT        ORCL
2018-06-04  942870.9225 795721.6978 808033.8064 559683.8431 131306.1865 781150.6901 193175.0512
2018-06-05  950145.3268 795208.7988 823114.6586 558699.2999 131912.0456 785145.9528 192399.4117
2018-06-06  953438.4692 792862.4102 822823.5225 554066.1556 132839.1936 787450.9121 194930.4458
2018-06-07  950882.5975 783977.2272 819693.8089 544915.6954 133435.8730 775080.9641 194644.6838
2018-06-08  942231.9546 782312.8482 817117.2541 547579.7534 134151.8882 780843.3622 196685.8403
"""
sp="""date      AAPL        FB     GOOG    AMZN      IBM        MSFT       ORCL
2018-06-04  189.6813    193.28  1139.29 1665.27 136.5008    100.4157    46.5525
2018-06-05  191.1447    192.94  1139.66 1696.35 137.1307    100.9293    46.3656
2018-06-06  191.8072    191.34  1136.88 1695.75 138.0945    101.2256    46.9755
2018-06-07  191.2930    188.18  1123.86 1689.30 138.7148     99.6354    46.9067
"""
marketcap=pd.read_csv(pd.compat.StringIO(mc),header=0,sep="\s+",parse_dates=True,index_col=0)
prices=pd.read_csv(pd.compat.StringIO(sp),header=0,sep="\s+",parse_dates=True,index_col=0)
portfolioReturns=pd.DataFrame()

def weightedReturn(key):
    dailyReturns=prices[key].pct_change(1)
    weights=marketcap[key]
    portfolioReturns[key]=dailyReturns*weights

[weightedReturn(key) for key in prices.columns]
print(portfolioReturns)

产生:

                 AAPL         FB       GOOG        AMZN       IBM        MSFT       ORCL
date                                                                                    
2018-06-04        NaN        NaN        NaN         NaN       NaN         NaN        NaN
2018-06-05  7330.4151  -982.8113   258.2549  15362.3158  608.7246   4015.8159  -772.4494
2018-06-06  3304.5802 -4594.7230 -1934.0483   -291.0332  933.6379   2311.7341  2564.1441
2018-06-07 -2549.1422 -8999.3394 -8978.4177  -3117.8093  599.3741 -12176.1071  -285.0753
2018-06-08        NaN        NaN        NaN         NaN       NaN         NaN        NaN

当然,portfolioReturns.mean(axis=1)会返回投资组合的平均每日回报。

或者,作为一行代码:print(prices.pct_change()).multiply(marketcap).mean(axis=1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接