Панды: как накапливать прибыль - прогнозирование цен - PullRequest
0 голосов
/ 31 октября 2019

У меня есть pandas dataframe цен на акции, проиндексированных по дате (ежемесячные данные). Я хочу подсчитать следующее: начиная с 100 акций по состоянию на 31 января 1983 года на сумму 4100 долл. США (41,00 за акцию), что является максимальным абсолютным значением акций в марте 2012 года, если бы я мог точно спрогнозировать конечную цену следующего месяца.

  • , если конечная цена следующего месяца выше конечной цены этого месяца: покупать акции на полную сумму и полностью участвовать в возврате акций
  • , если конечная цена следующего месяца ниже конечной цены этого месяца: продать всеакции и возьмите наличные в начале месяца (не участвуйте в потере запасов)

enter image description here

Вот некоторые примеры данных для работы с:

df = pd.DataFrame({
    'Date': ['1983-01-01','1983-02-28','1983-03-31','1983-04-30','1983-05-31'],
    'Month End Price': [41.00,46.75,44.25,50.00,59.25]
}).set_index('Date')

df.index = pd.to_datetime(df.index)

Например, в феврале 1983 года цена акций выросла с 41,00 до 46,75, что является возвращением 14,02% в этом месяце. Таким образом, мои акции, первоначально стоившие 4100 долларов, выросли до 4100 долларов * (1 + 14,02%) = 4675 долларов на конец февраля 1983 года.

В 83 марта наблюдается отрицательная доходность (цена снижается с 46,75). до 44,25). Узнав об этом снижении, я продал бы все акции на сумму 4675 долларов на конец февраля (без учета потерь), а затем реинвестировал бы в начале апреля 1983 года.

В апреле 1983 года эффективность акций составила + 12,99% (50,00). /44,25 -1), поэтому мой собственный капитал увеличится с 4675 до 4675 долларов * (1 + 12,99%) = 5282,5 доллара до конца апреля 1983 года.

1 Ответ

1 голос
/ 31 октября 2019

Вы можете сделать это более компактно, но я настрою несколько промежуточных столбцов, чтобы логика была ясной. Во-первых, я собираюсь установить образец набора данных с несколькими взлетами и падениями.

import pandas as pd

prices = [50.00,46.75,44.25,50.00,59.25,66.50,
          29.25,44.25,59.25,61.00,64.25,65.25]
dates = pd.date_range('01-31-1983','12-31-1983', freq='m')

df = pd.DataFrame({'Month End Price':prices}, index=dates)

Это приводит к кадру данных, который выглядит так:

           Month End Price
1983-01-31            50.00
1983-02-28            46.75
1983-03-31            44.25
1983-04-30            50.00
1983-05-31            59.25
1983-06-30            66.50
1983-07-31            29.25
1983-08-31            44.25
1983-09-30            59.25
1983-10-31            61.00
1983-11-30            64.25
1983-12-31            65.25

И это: enter image description here

Вы можете рассчитать месячные колебания цены следующим образом:

df['Monthly Returns'] = df['Month End Price'].diff()/df['Month End Price']

Мы хотим реализовать все выгоды и избежать всех потерь, от которых японять. Я установил столбец множителей, который равен 1 для месяцев, когда мы должны были избежать потерь, и в основном равен 1 + df['Monthly Returns'] для месяцев с прибылью. Затем я вычисляю столбец Cash как кумулятивное произведение столбца Multiplier, умноженного на $ 41, который был нашим основным. Существует соблазн использовать цикл for, но с Pandas, каждый раз, когда вы видите for, часто есть более быстрый, встроенный, как cumprod:

df['Multiplier'] = df['Monthly Returns'].apply(lambda x: max(x, 0)) + 1
df['Cash'] = df['Multiplier'].cumprod() * 41

Как только все этосделано, у нас есть что-то похожее на:

           Month End Price  Monthly Returns  Multiplier        Cash
1983-01-31            50.00              NaN         NaN   41.000000
1983-02-28            46.75        -0.069519    1.000000   41.000000
1983-03-31            44.25        -0.056497    1.000000   41.000000
1983-04-30            50.00         0.115000    1.115000   45.715000
1983-05-31            59.25         0.156118    1.156118   52.851941
1983-06-30            66.50         0.109023    1.109023   58.613995
1983-07-31            29.25        -1.273504    1.000000   58.613995
1983-08-31            44.25         0.338983    1.338983   78.483145
1983-09-30            59.25         0.253165    1.253165   98.352296
1983-10-31            61.00         0.028689    1.028689  101.173878
1983-11-30            64.25         0.050584    1.050584  106.291623
1983-12-31            65.25         0.015326    1.015326  107.920614

И значение позиций выглядит так:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...