计算多余 returns

Computing excess returns

我想计算股票 returns 数据帧的超额 returns,其中超额 returns 定义为股票 returns 与市场之间的差异,其中市场由股票代码 SPY 表示。下面是最小示例

dict0 = {'date': [1/1/2020,1/1/2020,1/1/2020,1/2/2020,1/2/2020,1/2/2020,,1/3/2020,1/3/2020,1/3/2020], 'ticker': ['SPY','AAPL','SPY','AAPL', 'MSFT','SPY','AAPL','MSFT'], 'returns': [1,2,3,4,5,6,7,8,9]}
df = pd.DataFrame(dict0)### 
df.set_index(['date','ticker'])

目标是创造超额returns(即超出市场的一切,等于代码 SPY)

df['excess_returns']= [0,1,2,0,1,2,0,1,2]

最后一行代码 set_index,您应该将数据帧分配回自身或就地执行。 剩下的你可以按如下方式进行:

def func(row):
    date, asset = row.name
    return df.loc[(date, asset), 'returns'] - df.loc[(date, 'SPY'), 'returns']



dict0 = {'date': ['1/1/2020', '1/1/2020', '1/1/2020', '1/2/2020', '1/2/2020',
                  '1/2/2020', '1/3/2020', '1/3/2020', '1/3/2020'],
         'ticker': ['SPY', 'AAPL', 'MSFT', 'SPY', 'AAPL', 'MSFT', 'SPY', 'AAPL', 'MSFT'],
         'returns': [1, 2, 3, 4, 5, 6, 7, 8, 9]}
df = pd.DataFrame(dict0)  ###
df = df.set_index(['date', 'ticker'])
df['excess_returns'] = df.apply(func, axis=1)

这是矢量化的解决方案:

一个班轮

df['excess_returns'] = df.returns - df.groupby('date').returns.transform('first')

完整解决方案

dict0 = {'date': ['1/1/2020', '1/1/2020', '1/1/2020', '1/2/2020', '1/2/2020',
                  '1/2/2020', '1/3/2020', '1/3/2020', '1/3/2020'],
         'ticker': ['SPY', 'AAPL', 'MSFT', 'SPY', 'AAPL', 'MSFT', 'SPY', 'AAPL', 'MSFT'],
         'returns': [1, 2, 3, 4, 5, 6, 7, 8, 9]}
df = pd.DataFrame(dict0)

## Firstly I would convert date to datetime type, if required
df.date = pd.to_datetime(df.date, format='%d/%m/%Y')
df['excess_returns'] = df.returns - df.groupby('date').returns.transform('first')

## by any means if I require to set the index to date and ticker
df = df.set_index(['date', 'ticker']) ## Only if required

df

输出

                    returns excess_returns
date        ticker      
2020-01-01  SPY     1       0
            AAPL    2       1
            MSFT    3       2
2020-02-01  SPY     4       0
            AAPL    5       1
            MSFT    6       2
2020-03-01  SPY     7       0
            AAPL    8       1
            MSFT    9       2