tradetime.date#

class tradetime.date(year=None, month=None, day=None, pydate=None, freq=None, ignore=False)

生成交易日期对象

参数 Parameters#

  • year: int

    • 交易年份。

  • month: int

    • 交易月份。

  • day: int

    • 交易日。

  • pydate: int, str, datetime.date, datetime.datetime

    • int或者str,如20211231、’20211231’、’2021-12-31’;

    • python的datetime格式日期,可直接转化为tradetime.date;

  • freq: str

    • 频率,不指定则使用默认频率

  • ignore: bool

    • 是否对频率进行检查,默认True。


类属性 Class Attributes#


date.default_freqN#

默认频率与频数,V0.1.0版本尚不支持改动default_freqN

>>> tradetime.date.default_freqN
1

date.default_freqType#

>>> tradetime.date.default_freqType
'D'

date.[freq]#

获取交易日历,支持日、周、月、季、年频:

>>> tradetime.date.D           
<tradetime.Calendar object at 0x000001B429C1A8B0>

>>> tradetime.date.D.close.head()
0    2005-01-04
1    2005-01-05
2    2005-01-06
3    2005-01-07
4    2005-01-10
Name: date, dtype: object

获取季度交易日历,通过openclose获取该频率的起始bar,为pd.Series格式:

>>> tradetime.date.Q.open.head()
0    2005-01-04
1    2005-04-01
2    2005-07-01
3    2005-10-10
4    2006-01-04
Name: date, dtype: object

>>> tradetime.date.Q.close.head()   
0    2005-03-31
1    2005-06-30
2    2005-09-30
3    2005-12-30
4    2006-03-31
Name: date, dtype: object

date.calendar_open/date.calendar_close/date.calendar#

获取交易日历字典,同样用于提取交易日历

>>> tradetime.date.calendar.keys()
dict_keys(['D', 'W', 'M', 'Q', 'Y'])

>>> tradetime.date.calendar['D'].head()
0    2005-01-04
1    2005-01-05
2    2005-01-06
3    2005-01-07
4    2005-01-10
Name: time, dtype: object

>>> tradetime.date.calendar_open['Y'].head()
0    2005-01-04
1    2006-01-04
2    2007-01-04
3    2008-01-02
4    2009-01-05
Name: time, dtype: object

类方法 Class Methods#

date.bars#

tradetime.date.bars(start_date, end_date, freq=None, is_open=False, overflow=False)

获取一段时间区间的交易日期

Parameters:

  • start_date: _AnyDatetime_Type

    • 开始日期

  • end_date: _AnyDatetime_Type

    • 结束日期

  • freq: str

    • 指定频率

  • is_open: bool

    • bars是否为开始日期,默认False。

  • overflow: bool

    • 结束日期是否溢出,默认False。

Returns:

  • pd.Series

    交易日期所处对应频率交易日历的位置

Examples:

# 一段时间的open bars
>>> tradetime.date.bars(datetime.date(2022, 2, 1), datetime.date(2022, 3, 12), freq='W', is_open=True)
0    2022-02-07
1    2022-02-14
2    2022-02-21
3    2022-02-28
4    2022-03-07

# 一段时间的close bars
>>> tradetime.date.bars(datetime.date(2022, 2, 1), datetime.date(2022, 3, 12), freq='W')
0    2022-02-11
1    2022-02-18
2    2022-02-25
3    2022-03-04
4    2022-03-11
Name: date, dtype: object

# 允许溢出
>>> tradetime.date.bars(datetime.date(2022, 2, 1), datetime.date(2022, 3, 12), freq='W', overflow=True) 
0    2022-02-11
1    2022-02-18
2    2022-02-25
3    2022-03-04
4    2022-03-11
5    2022-03-18

date.quarter_range#

tradetime.date.quarter_range(start_date, end_date, type_: type = None, fmt: str = None, **kw_bars)

获取一段季度日期,可以自定义格式

Parameters:

  • start_date: _AnyDatetime_Type

    • 开始日期

  • end_date: _AnyDatetime_Type

    • 结束日期

  • type_: type

    • 指定类型,可以为str

  • fmt: str

    • 自定义格式,默认’2022Q1’

  • kw_bars:

    • 可以传入date.bars其他参数

Returns:

  • pd.Series

    一段季度日期

Examples:

# 每个季度的最后一个交易日
>>> tradetime.date.quarter_range(20200101, 20201231)
0    2020-03-31
1    2020-06-30
2    2020-09-30
3    2020-12-31
Name: date, dtype: object

# 每个季度的首个交易日
>>> tradetime.date.quarter_range(20200101, 20201231, is_open=True) 
0    2020-01-02
1    2020-04-01
2    2020-07-01
3    2020-10-09
        
>>> tradetime.date.quarter_range(20200101, 20201231, type_=str)
0    2020Q1
1    2020Q2
2    2020Q3
3    2020Q4
Name: date, dtype: object

>>> tradetime.date.quarter_range(20200101, 20201231, type_=str, fmt='Year(y)Quarter(q)') 
0    Year2020Quarter1
1    Year2020Quarter2
2    Year2020Quarter3
3    Year2020Quarter4
Name: date, dtype: object

date.current#

tradetime.date.current(freq=None, if_break: str = None)

获取当前所处的bar

Parameters:

  • freq: str

    • 指定频率

  • if_break: str

    • 非交易日处理,可选'past''future'None

    • 'past'表示取历史日期,'future'表示取未来日期,None表示正常处理;

Returns:

  • tradetime.date

    当前所处的bar

Examples:

# 假设今天为 2022-03-20
>>> tradetime.date.current()
date(year=2022, month=3, day=21, freq='D')

>>> tradetime.date.current('W') 
date(year=2022, month=3, day=25, freq='W')

>>> tradetime.date.current('Q') 
date(year=2022, month=3, day=31, freq='Q')

# 假设今天为 2022-01-01非交易日
>>> tradetime.date.current() 
Traceback (most recent call last):   
	...     
ValueError: The date is external break, missing param if_break.
    
>>> tradetime.date.current(if_break='past')                                                
date(year=2019, month=12, day=31, freq='D')

date.future#

tradetime.date.future(n=1, freq=None)

获取未来第n个bar,默认下一个,不支持非交易日使用

Parameters:

  • n: int

    • 位移数量,默认为1

  • freq: str

    • 指定频率,默认为默认频率

Returns:

  • tradetime.date

    未来的bar

Examples:

# 假设今天为 2022-03-20
>>> tradetime.date.future(n=1, freq='W') 
date(year=2022, month=4, day=1, freq='W')

>>> tradetime.date.future(n=1, freq='Q')  
date(year=2022, month=6, day=30, freq='Q')
# 假设今天为 2022-04-01
>>> tradetime.date.future()     
date(year=2022, month=4, day=6, freq='D')
>>> tradetime.date.previous()
date(year=2022, month=3, day=31, freq='D')

date.previous#

tradetime.date.previous(n=1, freq=None)

获取之前第n个bar,默认上一个,不支持非交易日使用

Parameters:

  • n: int

    • 位移数量,默认为1

  • freq: str

    • 指定频率

Returns:

  • tradetime.date

    之前的bar

Examples:

# 假设今天为 2022-03-20
>>> tradetime.date.previous(n=1, freq='Q') 
date(year=2021, month=12, day=31, freq='Q')

>>> tradetime.date.previous(n=1, freq='W')  
date(year=2022, month=3, day=18, freq='W')

date.is_trading#

tradetime.date.is_trading(d=None)

判断该日期是否为交易日

Parameters:

  • d: _AnyDatetime_Type

    • 日期

Returns:

  • bool

    是否为交易日

Examples:

>>> tradetime.date.is_trading(datetime.date(2022, 3, 18)) 
True

>>> tradetime.date.is_trading(datetime.date(2022, 3, 19)) 
False

date.is_break#

tradetime.date.is_break(d=None)

判断该日期是否为非交易日

Parameters:

  • d: _AnyDatetime_Type

    • 日期

Returns:

  • bool

    是否为非交易日

Examples:

>>> tradetime.date.is_break(datetime.date(2022, 3, 18))   
False

>>> tradetime.date.is_break(datetime.date(2022, 3, 19))   
True

date.break_type#

tradetime.date.break_type(d=None, freq=’D’)

判断非交易日类型,分为时间段间非交易日和时间段内非交易日

Parameters:

  • d: _AnyDatetime_Type

    • 日期

  • freq: str

    • 频率

Returns:

  • str

    非交易日类型

Examples:

>>> tradetime.date.break_type(20200101, 'D') 
'external break'
>>> tradetime.date.break_type(20200101, 'W') 
'internal break'
>>> tradetime.date.break_type(20200101, 'M') 
'external break'
>>> tradetime.date.break_type(20200101, 'Q') 
'external break'
>>> tradetime.date.break_type(20200101, 'Y') 
'external break'

date.get_close#

tradetime.date.get_close(year=None, q=None, m=None)

获取某年某个季度或者某个月份的最后一个交易日期

Parameters:

  • year: int

    • 年份

  • q: int

    • 第几个季度,只能为1,2,3,4

  • m: int

    • 第几个月,只能为1-12

Returns:

  • tradetime.date

    最后一个交易日

Examples:

>> > tradetime.date.get_close(2021, m=7)
date(year=2021, month=7, day=30, freq='M')

>> > tradetime.date.get_close(2021, q=3)
date(year=2021, month=9, day=30, freq='Q')

date.get_open#

tradetime.date.get_open(year=None, q=None, m=None)

获取某年某个季度或者某个月份的第一个交易日期

Parameters:

  • year: int

    • 年份

  • q: int

    • 第几个季度,只能为1,2,3,4

  • m: int

    • 第几个月,只能为1-12

Returns:

  • tradetime.date

    第一个交易日

>> > tradetime.date.get_open(2021, m=7)
date(year=2021, month=7, day=1, freq='M')

>> > tradetime.date.get_open(2021, q=3)
date(year=2021, month=7, day=1, freq='Q')

date.set_option#

tradetime.date.set_option(default_freq: str = ‘D’)

设置tradetime.date的默认频率

Parameters:

  • default_freq: str

    • 频率

Returns:

  • None

Examples:

# 将默认频率设置为周频
>>> tradetime.date.set_option('W')  

类实例 Object Instance#


  • 没有参数时,默认按照今天创建交易日期

    # 今日是2022-04-28
    
    >>> tradetime.date()
    date(year=2022, month=4, day=28, freq='D')
    
    >>> tradetime.date(freq='W') 
    Traceback (most recent call last):
    	...
    ValueError: 2022-04-28 doesn't match freq W
    
  • 查看当前默认频率,创建实例tradetime.date,并自动进行检查是否满足该频率bar的close

    >>> tradetime.date.default_freqType
    'D'
    >>> tradetime.date(2022, 3, 18)
    date(year=2022, month=3, day=18, freq='D')
    

  • 或者将datetime.date转换为tradetime.date实例:

    >>> tradetime.date(pydate=datetime.date(2022, 3, 18)) 
    date(year=2022, month=3, day=18, freq='D')
    

  • 对于不满足默认频率的交易日期,将抛出ValueError,但也可以通过ignore参数关闭该检查:

    >>> tradetime.date(pydate=datetime.date(2022, 3, 19)) 
    Traceback (most recent call last):
      ...
    ValueError: 2022-03-19 doesn't match freq D
    
    >>> tradetime.date(pydate=datetime.date(2022, 3, 19), ignore=True) 
    date(year=2022, month=3, day=19, freq='D')
    
  • 可通过指定频率,创建非日频交易日期,同样可以通过ignore参数关闭检查:

    >>> tradetime.date(2021, 12, 24, freq='W') 
    date(year=2021, month=12, day=24, freq='W')
    
    >>> tradetime.date(2021, 12, 25, freq='W')              
    Traceback (most recent call last):                                                   
    	...                  
    ValueError: 2021-12-25 doesn't match freq W
    
    >>> tradetime.date(2021, 12, 25, freq='W', ignore=True) 
    date(year=2021, month=12, day=25, freq='W')
    

类实例属性 Object Attributes#


date默认频率设置为M月频,接下来查看其属性:

>>> tradetime.set_date('M') 

>>> d = tradetime.date(2022, 3, 31) 

>>> d
date(year=2022, month=3, day=31, freq='M')

date.year#

>>> d.year
2022

date.quarter#

>>> d.quarter
1   

date.month#

>>> d.month
3

date.day#

>>> d.day
31

date.ignore#

>>> d.ignore
False

date.freq#

>>> d.freq
'M'

类实例方法 Object Methods#


date.index#

tradetime.date.index(freq: str = None)

获取交易日期所处指定频率交易日历的索引位置

Parameters:

  • freq: str

    • 频率,默认为tradetime.date.freq

Returns:

  • int

    交易日期所处对应频率交易日历的位置

Examples:

>>> tradetime.date(2022, 3, 31, freq='M').index()
206
>>> tradetime.date(2022, 3, 31, freq='M').index('D') 
4189

date.validate#

tradetime.date.validate(freq: str = None)

验证对象是否符合该频率

Parameters:

  • freq: str

    • 频率,默认为tradetime.date.freq

Returns:

  • bool

    是否符合频率

Examples:

>>> tradetime.date(2022, 3, 31, freq='M').validate() 
True
>>> tradetime.date(2022, 3, 31, freq='M').validate('W') 
False

date.open#

tradetime.date.open(freq: str = None, if_break: str = None)

获取频率对应bar开始日期,接受交易日和非交易日

Parameters:

  • freq: str

    • 频率,默认为tradetime.date.freq

  • if_break: str

    • 非交易日处理,可选'past''future'None

    • 'past'表示取历史日期,'future'表示取未来日期,None表示正常处理;

Returns:

  • tradetime.date

    日期所处频率对应bar的开始日期

Examples:

# 默认为M,2022-03-31处在2022年3月bar,第一个交易日为2022-03-01
>> > tradetime.date(2022, 3, 31, freq='M').open()
date(year=2022, month=3, day=1, freq='M')

# 设置为周频,则对应周bar第一个交易日为2022-03-28
>> > tradetime.date(2022, 3, 31, freq='M').open('W')
date(year=2022, month=3, day=28, freq='W')

如果当天是时间段内非交易日

>>> d = tradetime.date(pydate=20200101, freq='D', ignore=True) 
>>> d
date(year=2020, month=1, day=1, freq='D')

# 判断是否为交易日
>>> tradetime.date.is_break(d) 
True

# 指定频率,判断非交易日类型
>>> tradetime.date.break_type(d, 'W') 
'internal break'

# 时间段内非交易日
>>> d.open('W') 
date(year=2019, month=12, day=30, freq='W')
>>> d.open('W', 'future') 
date(year=2020, month=1, day=6, freq='W')
>>> d.open('W', 'past')   
date(year=2019, month=12, day=23, freq='W')

如果当天是时间段间非交易日

>>> tradetime.date.break_type(d, 'M')
'external break'

# 时间段间非交易日
>>> d.open('M') 
Traceback (most recent call last):
	...
ValueError: The date is external break, missing param if_break.
    
>>> d.open('M', 'past') 
date(year=2019, month=12, day=2, freq='M')
>>> d.open('M', 'future') 
date(year=2020, month=1, day=2, freq='M')

date.close#

tradetime.date.close(freq: str = None, if_break: str = None)

获取频率对应bar结束日期,接受交易日和非交易日

Parameters:

  • freq: str

    • 频率,默认为tradetime.date.freq

  • if_break: str

    • 非交易日处理,可选'past''future'None

    • 'past'表示取历史日期,'future'表示取未来日期,None表示正常处理;

Returns:

  • tradetime.date

    日期所处频率对应bar的结束日期

Examples:

>> > tradetime.date(2022, 3, 31, freq='M').close()
date(year=2022, month=3, day=31, freq='M')

>> > tradetime.date(2022, 3, 31, freq='M').close('W')
date(year=2022, month=4, day=1, freq='W')

如果当天是时间段内非交易日

>>> d = tradetime.date(pydate=20200101, freq='D', ignore=True) 
>>> d
date(year=2020, month=1, day=1, freq='D')

# 判断是否为交易日
>>> tradetime.date.is_break(d) 
True

# 指定频率,判断非交易日类型
>>> tradetime.date.break_type(d, 'W') 
'internal break'

# 时间段内非交易日
>>> d.close('W') 
date(year=2020, month=1, day=3, freq='W')
>>> d.close('W', 'past') 
date(year=2019, month=12, day=27, freq='W')
>>> d.close('W', 'future') 
date(year=2020, month=1, day=10, freq='W')

如果当天是时间段间非交易日

>>> tradetime.date.break_type(d, 'M')
'external break'

# 时间段间非交易日
>>> d.close('M') 
Traceback (most recent call last):
	...
ValueError: The date is external break, missing param if_break.
    
>>> d.close('M', 'past')  
date(year=2019, month=12, day=31, freq='M')
>>> d.close('M', 'future') 
date(year=2020, month=1, day=23, freq='M')

date.range#

tradetime.date.range(freq: str = None, if_break: str = None)

获取频率对应bar的开始和结束日期区间

Parameters:

  • freq: str

    • 频率,默认为tradetime.date.freq

  • if_break: str

    • 非交易日处理,可选'past''future'None

    • 'past'表示取历史日期,'future'表示取未来日期,None表示正常处理;

Returns:

  • Tuple[datetime.date, datetime.date]

    日期所处频率对应bar的开始和结束日期区间

Examples:

>>> tradetime.date(2022, 3, 31, freq='M').range('W') 
(date(year=2022, month=3, day=28, freq='W'), date(year=2022, month=4, day=1, freq='W'))

>>> tradetime.date(2022, 3, 31, freq='M').range('Y') 
(date(year=2022, month=1, day=4, freq='Y'), date(year=2022, month=12, day=30, freq='Y'))


# 如果是非交易日
>>> tradetime.date(2020, 1, 1, freq='M', ignore=True).range('M', 'past') 
(date(year=2019, month=12, day=2, freq='M'), date(year=2019, month=12, day=31, freq='M'))

>>> tradetime.date(2020, 1, 1, freq='M', ignore=True).range('M', 'future') 
(date(year=2020, month=1, day=2, freq='M'), date(year=2020, month=1, day=23, freq='M'))

date.is_open#

tradetime.date.is_open(freq: str = None)

判断是否为该频率的开始日期

Parameters:

  • freq: str

    • 频率,默认为tradetime.date.freq

Returns:

  • bool

    是否为该频率的开始日期

Examples:

# 一开始指定为'M'频率,需要ignore,然后判断是否为该频率的open
>> > tradetime.date(2022, 3, 1, freq='M', ignore=True).is_open()
True
# 检查一个日频交易日期,是否为月频上的open
>> > tradetime.date(2022, 3, 1, freq='D').is_open('M')
True

date.is_close#

tradetime.date.is_close(freq: str = None)

判断是否为该频率的结束日期

Parameters:

  • freq: str

    • 频率,默认为tradetime.date.freq

Returns:

  • bool

    是否为该频率的结束日期

Examples:

>> > tradetime.date(2022, 3, 1, freq='D').is_close('M')
False
>> > tradetime.date(2022, 3, 31, freq='D').is_close('M')
True
>> > tradetime.date(2022, 3, 31, freq='M').is_close()
True

date.py_date#

tradetime.date.py_date()

>>> tradetime.date(2022, 1, 4).py_date() 
datetime.date(2022, 1, 4)

date.pd_date#

tradetime.date.pd_date()

>>> tradetime.date(2022, 1, 4).pd_date() 
DatetimeIndex(['2022-01-04'], dtype='datetime64[ns]', freq=None)

date.nearest#

tradetime.date.nearest(if_break: str = None)

获取最近的一个交易日,当本身就是交易日时,返回自己

Parameters:

  • if_break: str

    • 非交易日处理,可选'past''future'

    • 'past':向历史取最近的一个交易日;

    • 'future':向未来取最近的一个交易日;

Returns:

  • bool

    是否为该频率的结束日期

Examples:

>>> d = tradetime.date(pydate=20200101, freq='D', ignore=True) 
>>> d
date(year=2020, month=1, day=1, freq='D')

>>> d.close('M', 'past')
Traceback (most recent call last):                                                
	...
ValueError: The date is break, missing param if_break.     
 
>>> d.nearest('past')
date(year=2019, month=12, day=31, freq='D')

>>> d.nearest('future')
date(year=2020, month=1, day=2, freq='D')

实例运算符 Object Operators#

Bar位移#

  • int,进行bar位移

    # 加法
    >>> tradetime.date(2022, 3, 18, freq='D') + 3 
    date(year=2022, month=3, day=23, freq='D')
    
    >>> tradetime.date(2022, 3, 18, freq='W') + 3 
    date(year=2022, month=4, day=8, freq='W')
    
    # 减法
    >>> tradetime.date(2022, 3, 18, freq='D') - 3  
    date(year=2022, month=3, day=15, freq='D')
    
    >>> tradetime.date(2022, 3, 18, freq='W') - 3 
    date(year=2022, month=2, day=25, freq='W')
    
    # 不建议反向进行加减,这样做会很奇怪
    >>> tradetime.date.operation_inverse = True  # 必须设置后才可以反向运算
    
    >>> 3 + tradetime.date(2022, 3, 18, freq='D')
    date(year=2022, month=3, day=23, freq='D')
    >>> 3 - tradetime.date(2022, 3, 18, freq='D')
    date(year=2022, month=3, day=15, freq='D')
    

  • tradetime.bardelta,进行bar位移

    >>> tradetime.date(2022, 3, 18, freq='D') + tradetime.bardelta(date_bars=2)                
    date(year=2022, month=3, day=22, freq='D')
    
    # 必须频率一致
    >>> tradetime.date(2022, 3, 18, freq='D') + tradetime.bardelta(date_bars=2, date_freq='Q') 
    Traceback (most recent call last):                                                        
      ...
    ValueError: 2022-03-18 is not in freq 'Q'
     
    >>> tradetime.date(2022, 3, 18, freq='D') - tradetime.bardelta(date_bars=2)                
    date(year=2022, month=3, day=16, freq='D')
    
    # 同样不建议反向进行加减,这样做会很奇怪
    

时间位移#

  • datetime.delta,进行时间位移,而不是bar位移,不考虑是否为交易日;

    >>> tradetime.date(2022, 3, 18, freq='D') + datetime.timedelta(days=2) 
    date(year=2022, month=3, day=20, freq='D')
    
    >>> tradetime.date(2022, 3, 18, freq='W') + datetime.timedelta(days=3) 
    date(year=2022, month=3, day=21, freq='W')
    
    # 同样不建议反向进行加减,这样做会很奇怪
    

求差#

  • tradetime.date,求差,频率必须相同

    >>> tradetime.date(2022, 3, 31, freq='M') - tradetime.date(2022, 1, 28, freq='M')
    bardelta(date_bars=2, date_freq=M)
    
    # 默认日频,表示相差三个交易日
    >>> tradetime.date(2022, 3, 31) - tradetime.date(2022, 3, 28) 
    bardelta(date_bars=3, date_freq=D)
    

实例比较符 Object Comparison#

  • tradetime.date,与频率无关

    >>> tradetime.date(2022, 3, 1, freq='D') < tradetime.date(2022, 3, 31, freq='Q') 
    True
    

  • datetime,与频率无关

    >>> tradetime.date(2022, 3, 1, freq='D') == datetime.date(2022, 3, 1)            
    True
    
    # 默认今天,2022-03-20
    >>> tradetime.date(2022, 3, 1, freq='D') < datetime.time()            
    True