Как запустить более сложные функции агрегирования в groupby в python - PullRequest
1 голос
/ 06 мая 2020

Новичок с python здесь. Просто использую Spyder для работы, связанной с финансами. Я мог бы использовать некоторые рекомендации по приведенному ниже .. Я даже не пробовал код, так как не знаю, с чего начать.

У меня есть pandas фрейм данных, который организован так:

Month, portfolio name, return

месяц в формате 201501,201502. Возврат составляет%. У меня есть несколько сотен тысяч наблюдений.

Я хотел бы каждое утро получать статистику на уровне названия портфеля - общий доход, доход за указанные периоды, скользящие числа объема, максимальную просадку за весь период и т. Д. c.

На высоком уровне, как лучше всего это сделать? Я чувствую, что мне нужно сгруппировать по названию портфолио и просто применить различные функции, которые либо существуют в некоторых статистических или финансовых пакетах, либо я могу написать сам, но по какой-то причине не могу найти хороших примеров этого на практике. Кроме того, с чем-то вроде максимальной просадки за период имеет значение порядок наблюдений - нужно ли мне делать что-то другое здесь, когда мы группируемся, или pandas будем читать его по порядку, пока он находится в datetime?

Опять же, ищу общие советы по вышеизложенному и указатели в правильном направлении. Возможно, когда я подойду ближе, я смогу здесь устранить неполадки с помощью кода.

заранее благодарим за любые ответы. Это мой первый пост, этот сайт помог мне оставаться на работе, отвечая на вопросы по Excel более 6 лет.

Пример данных
МЕСЯЦ, ИМЯ ПОРТФЕЛЯ, ВОЗВРАТ
201501, ПОРТ1,0.014
201502, ПОРТ1,0.0034
201503, ПОРТ1, -0,0045
201501, ПОРТ2,0.012
201502, PORT2,0.0054
201503, PORT2, -0.0174

РЕДАКТИРОВАТЬ: Я узнал о функциях roll () и expanding () pandas и теперь понимаю все это намного лучше. Я также не использовал AGG () для пользовательских функций. См. Ниже, как я создал агрегат для каждого портфеля по паре разных показателей. По любым c вопросам, которые у меня возникнут, я сделаю новый пост. Спасибо

    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)

1 Ответ

0 голосов
/ 06 мая 2020

Вот как я бы подошел к этому:

# 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 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...