这里是python的初学者。只是用spyder做一些财务相关的工作。我可以使用一些指导,在下面的。我甚至没有尝试过代码,因为我不知道该从哪里开始。
我有一个pandas的数据框架,是这样组织的
Month, portfolio name, return
月的格式是 201501,201502
.回报率是%。我有几十万个观察值。
我想在每天早上以投资组合名称为单位进行统计--总回报率、指定时期的回报率、滚动波动率数字、整个时期的最大缩减量等。
在高层次上,什么是最好的方法?我觉得我需要做的是按投资组合名称进行分组,然后应用不同的函数,这些函数要么存在于一些统计或金融软件包中,要么我可以自己编写,但由于某些原因,我无法找到实践中的好例子。另外,对于像最大缩水这样的东西,观察的顺序很重要--当我们groupby的时候,我是否需要在这里做一些不同的事情,或者只要是在datetime中,pandas就会按顺序读取?
再一次,希望得到关于上述问题的一般性建议,以及正确方向的指点。也许当我接近的时候,我可以在这里用代码来排除故障。
先谢谢大家的回复。这是我第一次发帖,6年多来,这个网站帮助我留住了一份回答excel问题的工作。
数据样本 MONTH,PORTFOLIO_NAME,RETURN 201501,PORT1,0.014 201502,PORT1,0.0034 201503,PORT1,-0.0045 201501,PORT2,0.012 201502,PORT2,0.0054 201503,PORT2,-0.0174
EDIT:我了解了pandas的rolling()和expansion()功能,现在明白了很多。我也一直没有使用AGG()进行自定义函数。下面看我是如何为每个投资组合创建几个不同指标的汇总。任何具体的问题我都会开一个新帖来解答。谅谅
import numpy as np
import pandas as pd
def rolled_ret(arr):
return arr.add(1).prod() -1
def ann_vol(arr):
return np.std(arr) * np.sqrt(12)
def max_drawdown(arr):
return arr.add(1).cumprod().diff().min()
full_return = df_final.groupby('PORTFOLIO_NAME')['RETURN'].agg(full_period_returns=rolled_ret,annualised_vol=ann_vol,MDD=max_drawdown)
下面是我的方法。
# Convert Month to datetime
df["MONTH"] = pd.to_datetime(df["MONTH"], format="%Y%m")
# create a new column with your period
df["PERIOD"] = df["MONTH"].dt.to_period("m")
# Now aggregate per period:
df.groupby(["PORTFOLIO_NAME","PERIOD"]).agg([("total",sum),("min",min),("max",max)])
| | ('RETURN', 'total') | ('RETURN', 'min') | ('RETURN', 'max') |
|:----------------------------------|----------------------:|--------------------:|--------------------:|
| ('PORT1', Period('2015-01', 'M')) | 0.014 | 0.014 | 0.014 |
| ('PORT1', Period('2015-02', 'M')) | 0.0034 | 0.0034 | 0.0034 |
| ('PORT1', Period('2015-03', 'M')) | -0.0045 | -0.0045 | -0.0045 |
| ('PORT2', Period('2015-01', 'M')) | 0.012 | 0.012 | 0.012 |
| ('PORT2', Period('2015-02', 'M')) | 0.0054 | 0.0054 | 0.0054 |
| ('PORT2', Period('2015-03', 'M')) | -0.0174 | -0.0174 | -0.0174 |