Python Pandas Количество дней в рыночных календарях (торговый день против календарных дней) - PullRequest
0 голосов
/ 02 августа 2020

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

A=datetime.strptime(UDate1[0],date_format) 
B=datetime.strptime(UDate2[0],date_format)

и могу вычесть вот так:

C=(A-B).days

, и мне возвращается целое число дней .. 5, 6 , 10, 11 ... что бы это ни было).

Мои данные должны соответствовать распределению журналов, однако, поскольку я сейчас использую календарные дни, а мои события происходят только в рыночные дни ... это неприемлемо источник ошибки, и он создает пустые гистограммы в моем распределении (дни 6 и 7 всегда равны нулю (выходные) и праздничные эффекты). Нет, Буэно.

Я не могу вычислить таким образом точную кумулятивную функцию распределения, поэтому недавно загрузил Pandas Календарь рынка. Есть ли у кого-нибудь опыт вычислений, как рассчитывать торговые дни по сравнению с рыночными днями. Например, если бы я смотрел на время с 19 июля 2020 года по 13 июля 2020 года. Это будет 12 календарных дней, но только 8 торговых дней. Любая помощь приветствуется

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Информация о Pandas календарях рынка находится здесь: https://pypi.org/project/pandas-market-calendars/

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

import pandas_market_calendars as mcal

# Create a calendar
nyse = mcal.get_calendar('NYSE')

early = nyse.schedule(start_date='2012-07-01', end_date='2012-07-10')

print(mcal.date_range(early, frequency='1D'))

DatetimeIndex(['2012-07-02 20:00:00+00:00', '2012-07-03 17:00:00+00:00',
               '2012-07-05 20:00:00+00:00', '2012-07-06 20:00:00+00:00',
               '2012-07-09 20:00:00+00:00', '2012-07-10 20:00:00+00:00'],
              dtype='datetime64[ns, UTC]', freq=None)

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

import pandas as pd

bus_day_index = pd.DatetimeIndex(
    ['2012-07-02 20:00:00+00:00', '2012-07-03 17:00:00+00:00',
     '2012-07-05 20:00:00+00:00', '2012-07-06 20:00:00+00:00',
     '2012-07-09 20:00:00+00:00', '2012-07-10 20:00:00+00:00'],
    dtype='datetime64[ns, UTC]', freq=None)

bus_day_index = bus_day_index.normalize()

s = pd.Series(data=1, index=bus_day_index)

cal_day_index = pd.date_range(start=bus_day_index.min(), end=bus_day_index.max())

s = s.reindex(index=cal_day_index).fillna(0).astype(int)

s = s.cumsum()

s['2012-07-09'] - s['2012-07-03']

Преимущество: этот (неэлегантный) метод включает неторговые дни, приходящиеся на будние дни (День памяти, День труда, et c. В США).

0 голосов
/ 03 августа 2020

Судя по вашему вопросу, вы хотите посчитать количество торговых дней. Если да, попробуйте следующее:

from datetime import datetime, date, timedelta

start_date = A
end_date = B
delta = timedelta(days=1)
count = 0
while start_date <= end_date:
    print (start_date.strftime("%Y-%m-%d"))
    if start_date.weekday() <=5:
       count +=1
    start_date += delta
print(count)
...