Ежемесячный возврат цен на акции с скачком времени с использованием панд - PullRequest
0 голосов
/ 28 сентября 2018

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

DATA ::

permno          date           prc

Firm A          1995-01-02       30

Firm A          1995-01-03       30.3

...

Firm B          1996-01-03       10.1

Что я пробовал до сих пор ::

df = DATA
#date columns are consisted with datestamps
df.loc[:, 'month'] = df.loc[:, 'date'].apply(lambda x : x.strftime('%Y%m'))
# **<code1>** choose first date from that month for each permno
df_ = df.sort_values('date').groupby(['permno', 'month']).first().reset_index()
# **<code2>**  caclulate monthly_return by getting pct_change()
df_['monthly_return'] = df_.sort_values('month').groupby('permno').prc.pct_change()

Однако я только что узнал, что некоторые ценные бумаги не обменивались в течение некоторых периодов.

Это приводит к двум проблемам:

  1. Использование лидоввыбрать false-start-point для некоторых ценных бумаг.Например, если обеспечение фирмы B не было продано 3 января 1997 года. (Предположим, что это первый день, когда другие ценные бумаги были впервые проданы в январе 1997 года.) Выбирается 4 января 1997 года. Следовательно, это приводит к просчетуЕжемесячная доходность по этой ценной бумаге

  2. Некоторые ценные бумаги не продавались дольше месяца.Предположим, фирма B не была продана на 1998.02.~ 2001.12 .. Тогда, используя, мы получим «Ежемесячный доход на 2002.01» = (цена на 2002.01 - цена на 1998.01) / (цена на 1998.01)

Есть ли какие-то простыеспособ справиться с такого рода данными с скачком периода?

1 Ответ

0 голосов
/ 28 сентября 2018

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

Сначала создайте примерный ряд данных с днями в качестве индекса:

periods = 10000
my_index = pd.date_range('2016-07-01', periods=periods, freq='D')
data = np.random.randint(100,1000,periods)
ts = pd.Series(data=data, index=my_index, name='Daily Returns')
print(ts.head())

Пример рядавыглядит следующим образом: Вопрос 1:

2016-07-01    348
2016-07-02    794
2016-07-03    650
2016-07-04    365
2016-07-05    291
Freq: D, Name: Monthly Returns, dtype: int64

При назначении значения nan в начале,

ts.iloc[0]=np.nan

Затем выполните повторную выборку Серии.«BMS» обозначает первый рабочий день.'backfill ()', чтобы избежать предвзятого предвзятости.

ts=ts.resample('BMS').backfill().pct_change().dropna()

И в полученном ряду нет наблюдений за первый месяц и второй месяц, так как нет данных для расчета прибыли.

2016-09-01    0.257343
2016-10-03   -0.296997
2016-11-01    0.433544
2016-12-01   -0.552980
2017-01-02   -0.390123
Freq: BMS, Name: Monthly Returns, dtype: float64

Вопрос 2: Вставьте больше нанов и сделайте то же самое:

ts.iloc[500:9000]=np.nan
ts=ts.resample('BMS').backfill().pct_change().dropna()

Это пропустит месяцы нанов и связанные с ними доходы.

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