Shortcuts

libfinance.api.calendar 源代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import bisect
import datetime
import pandas as pd

from libfinance.client import get_client
from libfinance.utils.decorators import export_as_api, ttl_cache, compatible_with_parm

def _to_timestamp(d):
    return pd.Timestamp(d).replace(hour=0, minute=0, second=0, microsecond=0)

@ttl_cache(24 * 3600)
def _get_all_trading_dates():
    return get_client().get_trading_calendar()

[文档]@export_as_api def get_trading_dates(start_date, end_date): r"""get the trading datata 获取A股某个区间的交易日期 :param start_date: 开始日期 :param end_date: 结束如期 Example:: 获取2020-05-10至2020-05-20之间的交易日期 .. code-block:: python3 from libfinance import get_trading_dates >>> trading_dates = get_trading_dates(start_date = "2020-05-11", end_date="2020-05-20") >>> print(trading_dates) DatetimeIndex(['2020-05-11', '2020-05-12', '2020-05-13', '2020-05-14', '2020-05-15', '2020-05-18', '2020-05-19', '2020-05-20'], dtype='datetime64[ns]', freq=None) """ trading_dates = _get_all_trading_dates() start_date = _to_timestamp(start_date) end_date = _to_timestamp(end_date) left = trading_dates.searchsorted(start_date) right = trading_dates.searchsorted(end_date, side='right') return trading_dates[left:right]
[文档]@export_as_api def get_previous_trading_date(date, n=1): """获取指定日期的之前的第 n 个交易日 :param date: 指定日期 :param n: 第 n 个交易日 Example:: 2020-05-18之前3天的交易日 .. code-block:: python3 from libfinance import get_previous_trading_date >>> get_previous_trading_date(date='2020-05-18', n=3) Timestamp('2020-05-13 00:00:00') """ trading_dates = _get_all_trading_dates() pos = trading_dates.searchsorted(_to_timestamp(date)) if pos >= n: return trading_dates[pos - n] else: return trading_dates[0]
[文档]@export_as_api def get_next_trading_date(date, n=1): """ 获取指定日期之后的第 n 个交易日 :param date: 指定日期 :param n: 第 n 个交易日 :example: .. code-block:: python3 from libfinance import get_next_trading_date >>> get_next_trading_date(date='2020-05-13', n=3) Timestamp('2020-05-18 00:00:00') """ trading_dates = _get_all_trading_dates() pos = trading_dates.searchsorted(_to_timestamp(date), side='right') if pos + n > len(trading_dates): return trading_dates[-1] else: return trading_dates[pos + n - 1]
[文档]@export_as_api def is_trading_date(date): date = _to_timestamp(date) trading_dates = _get_all_trading_dates() pos = trading_dates.searchsorted(date) return pos < len(trading_dates) and trading_dates[pos] == date
[文档]@export_as_api def get_n_trading_dates_until(date, n): trading_dates = _get_all_trading_dates() pos = trading_dates.searchsorted(_to_timestamp(date), side='right') if pos >= n: return trading_dates[pos - n:pos] return trading_dates[:pos]
[文档]@export_as_api def count_trading_dates(start_date, end_date): start_date = _to_timestamp(start_date) end_date = _to_timestamp(end_date) trading_dates = _get_all_trading_dates() return trading_dates.searchsorted(end_date, side='right') - trading_dates.searchsorted(start_date)
if __name__ == "__main__": start_date = "2024-01-01" end_date = "2024-02-27" trading_dates = get_trading_dates(start_date, end_date)