Новичок с 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)