Python熊猫市场日历日计数(交易日与日历日)

Python熊猫市场日历日计数(交易日与日历日),python,pandas,datetime,timedelta,Python,Pandas,Datetime,Timedelta,我正在进行一些市场研究,我正在调查的变量之一是事件发生的时间分布(对数分布),并创建一个累积概率密度函数(时间函数)。(我只是将我的日期转换为: A=datetime.strptime(UDate1[0],date_format) B=datetime.strptime(UDate2[0],date_format) 我可以这样减去: C=(A-B).days 我得到了一个天数的整数(5,6,10,11,不管是什么) 然而,我的数据应该符合日志分布,因为我目前使用日历日,我的事件只发生在市场

我正在进行一些市场研究,我正在调查的变量之一是事件发生的时间分布(对数分布),并创建一个累积概率密度函数(时间函数)。(我只是将我的日期转换为:

A=datetime.strptime(UDate1[0],date_format) 
B=datetime.strptime(UDate2[0],date_format)
我可以这样减去:

C=(A-B).days
我得到了一个天数的整数(5,6,10,11,不管是什么)

然而,我的数据应该符合日志分布,因为我目前使用日历日,我的事件只发生在市场日。。。这是一个不可接受的错误源,它在我的分布中创建了空直方图(第6天和第7天总是零(周末),假日效应)。不,布埃诺


我无法用这种方法计算出准确的累积分布函数,所以我最近下载了《加拿大市场日历》。有没有人有计算交易日和市场日的经验。例如,如果我看的是从2020年7月19日到2020年7月13日的时间。这将是12个日历日,但只有8个交易日。感谢您的帮助

您的问题听起来像是要计算交易天数。如果是,请尝试以下方法:

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)
从datetime导入datetime、date、timedelta
开始日期=A
结束日期=B
增量=时间增量(天数=1)
计数=0

熊猫市场日历上的开始日期信息如下:

首先,创建一个市场数据对象,如链接中所述:

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)
现在,创建一个值为1的系列,并按市场天数进行索引。然后在日历日重新编制索引,并用零填充缺少的值。计算累计金额,两个日期之间的交易天数是不同日期累计金额的差值:

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']

优点:这种(不雅观的)方法包含了工作日(美国的阵亡将士纪念日、劳动节等)的非交易日。

S.reindex在接近底部时做什么?S.reindex()从按交易日期索引改为按日历日期索引。所有新日期(即索引中的元素)都将填充NaN值。然后fillna()将它们改为零。这个方法很有效。你是对的,这不是最优雅的,但它确实起到了作用。如果我选择的开始日期是周末,或者结束日期是周末,那么这行代码s['2012-07-09']-s['2012-07-03']中就会出现错误;然而,因为我爸爸都是在市场上挑选的。。这不应该发生,你可以让
cal\u day\u index
早开始晚结束;这样可以消除你提到的错误。例如:
date\u range.min()-pd.DateOffset(days=10)
(注意日期偏移)。并在范围的末尾添加N天。我不知道有哪家图书馆会执行日期调整(按照约定修改,Act/365天计数约定等),这没问题,因为在代码的这一部分之前,我已经扫描了20年的市场数据回溯期,所以我数据库中的所有日期都基于市场开放日期。我目前正在将您建议的代码调整为“我的程序”及其工作模式的迭代。非常感谢!