Мой фрейм данных изначально выглядит так.
index ticker Adj Close
Date
2022-01-03 0 AXP 166.056259
2022-01-04 1 AXP 171.387100
2022-01-05 2 AXP 169.560791
2022-01-06 3 AXP 171.114563
2022-01-07 4 AXP 172.579315
Или, если я сбросил индекс, это выглядит так.
Date ticker Adj Close
0 2022-01-03 AXP 166.056229
1 2022-01-04 AXP 171.387100
2 2022-01-05 AXP 169.560791
3 2022-01-06 AXP 171.114563
4 2022-01-07 AXP 172.579300
У меня есть цены закрытия для 30 акций, и форма DF (1769, 3). Я могу легко получить возврат и средний доход:
returns = table.pct_change()
mean_returns = returns.mean()
Как проще всего получать еженедельные и ежемесячные доходы? Должна быть какая-то df.groupby 'W' или 'M', тогда возвраты рассчитываются автоматически, но когда я погуглил, я не нашел многого. Любые мысли о том, как заставить это работать в течение недель и месяцев?
Вы можете извлечь месяц и неделю в виде отдельных столбцов, как показано ниже, а затем вы можете использовать groupby с агрегатами первым и последним, что позволит вам вычислить прибыль за всю неделю (если вы держите акции)
import random
import pandas as pd
value = random.sample(range(1, 80), 79)
begin_date = '2019-10-16'
df = pd.DataFrame({'value': value,
'ticker':'tst',
'date':pd.date_range(begin_date, periods=len(value))})
df['year'] = df['date'].dt.isocalendar().year
df['week'] = df['date'].dt.isocalendar().week
df['month'] = df['date'].dt.month
weekly_increase = df.groupby(['year', 'week']).agg(['first','last'])
weekly_increase['increase'] = (weekly_increase[('value','last')] - weekly_increase[('value','first')]) / weekly_increase[('value','first')]
print(weekly_increase)
Результаты в
value ticker date month increase
first last first last first last first last
year week
2019 42 5 59 tst tst 2019-10-16 2019-10-20 10 10 10.800000
43 79 3 tst tst 2019-10-21 2019-10-27 10 10 -0.962025
44 58 26 tst tst 2019-10-28 2019-11-03 10 11 -0.551724
45 70 31 tst tst 2019-11-04 2019-11-10 11 11 -0.557143
46 78 62 tst tst 2019-11-11 2019-11-17 11 11 -0.205128
Что вы считаете "недельным приростом"? Я не рассматриваю связь недельного дохода со средним значением дохода на этой неделе, например, при удержании акций в течение недели недельный доход равен "(последняя_цена - первая_цена)/первая_цена". Но, может быть, вы рассматриваете другие случаи, в таком случае вам придется объяснять...
Да, выигрыш равен (последняя_цена - первая_цена)/первая_цена. У меня нет поля с именем «сумма» в фрейме данных. Вот что я говорю.
Я отредактировал ответ, чтобы решить, что, как я понимаю, вы хотите, а именно потенциальный выигрыш в каждом периоде. Я бы сказал, давайте опустим среднее значение, так как, например, 50% (прибыль), за которым следует -50% (убыток) в двух последовательных периодах, не является нулевой прибылью в целом (например: если значение равно 1, 1,5, 0,75, тогда 50% прибыль, за которой следует потеря 50%, на самом деле является потерей 25%, а не прибылью 0).
Это так? еженедельный_прирост = недельный_средний['сумма'].pct_change() ежемесячный_прирост = месячный_средний['сумма'].pct_change() Или это так? Weekly_Gains = Weekly_Mean['месяц'].pct_change() Monthly_Gains = Monthly_Mean['Неделя'].pct_change()