计算多余 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
我想计算股票 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