В настоящее время я использую свой фрейм данных с полем datetime для генерации ежемесячной серии возвратов по различным тикерам.
return_series=data.groupby([data['Date'].dt.year,data['Date'].dt.month]).apply(monthly_returns)
Текущий вывод выглядит примерно так, где значениями кортежей являются pnl, capital и return.
Date Date
2008 6 (-742.58, 150001.16, -0.495049504951)
7 (123142.08, 299304.14, 41.1427920777)
8 (-5963.05, 426217.67, -1.39906212711)
9 (-137316.34, 868529.72, -15.8102062414)
10 (4503.44, 685906.3, 0.656567814)
Я бы хотел разделить кортеж на три столбца (Capital, PnL, Returns) и изменить столбцы Dates на «Год, Месяц».
Функция ежемесячного возврата агрегирует по символам за данный месяц
def помесячно_ возврат (df_monthly):
symbols_pnl = df_monthly.groupby (df_monthly [ 'Символ']). Применить (symbol_return)
symbols_invested_capital = df_monthly.groupby (df_monthly [ 'Символ']). применить (symbol_capital)
возвращение (сумма (symbols_pnl), сумма (symbols_invested_capital), сумма (symbols_pnl) / сумма (symbols_invested_capital) * 100)
Входные данные суточных значений позиций
Дата Символ Позиция Предыдущее Положение Цена Exec Цена
24.06.2008 ABC 100 0 5 4.85
25.06.2008 EFG 200 150 10 9,8