簡體   English   中英

如何在 python 中的 groupby 上運行更復雜的聚合函數

[英]How do you run more complex aggregation functions on groupby in python

從這里開始使用 python。 只是將 spyder 用於一些與金融相關的工作。 我可以在下面使用一些指導。我什至沒有嘗試過代碼,因為我不知道從什么開始。

我有一個像這樣組織的 pandas dataframe

Month, portfolio name, return

月份的格式為201501,201502 回報是一個%。 我有幾十萬個觀察結果。

我想每天早上在投資組合名稱級別生成統計數據 - 總回報、指定時期的回報、滾動交易量、整個時期的最大回撤等。

在高層次上,最好的方法是什么? 我覺得我需要做的是 groupby 投資組合名稱,只需應用某些統計數據或財務 package 中存在的不同功能,或者我可以自己編寫,但由於某種原因在實踐中找不到很好的例子。 此外,由於在此期間的最大回撤,觀察的順序很重要 - 當我們分組時我是否需要在這里做一些不同的事情,或者 pandas 是否會按順序讀取它,只要它在日期時間?

再次,尋找關於上述內容的一般建議,以及正確方向的指針。 也許當我接近時,我可以在這里使用代碼進行故障排除。

提前感謝您的任何回復。 這是我的第一篇文章,這個網站幫助我在 6 年多的時間里繼續回答 excel 問題。

數據樣本
MONTH,PORTFOLIO_NAME,返回
201501,PORT1,0.014
201502,PORT1,0.0034
201503,PORT1,-0.0045
201501,PORT2,0.012
201502,PORT2,0.0054
201503,PORT2,-0.0174

編輯:我了解了 pandas 的 rolling() 和 expand() 功能,現在對它有了更多的了解。 我也沒有將 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 |

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM