python 获取交易日数据(二)

目录

1. 源代码

2. 案例演示

2.1 获取前后交易日

2.2 获取周度数据


   本期主要介绍如何获前一个和后一个交易日,以及获取周度交易日。

1. 源代码

class TRADE_DAY(object):
    def __init__(self, data, st=None, et=None):
        '''
        st: str,开始日期,格式如'2023-03-01'
        et: str,终止日期,格式如'2023-03-01'
        data:转换后的交易日数据源
        '''
        self.st = st
        self.et = et
        self.data = data

    @classmethod
    def data_change(cls, trade_day):
        # 对初始的数据进行清洗转换,此处可依据获取的数据源进行自主转换
        # 转换后的数据格式为DataFrame,只有一列,列名为date,值的格式为str,例如'2023-03-03'
        new_df = pd.DataFrame({'date': trade_day['trade_date']})
        new_df['date'] = new_df['date'].apply(lambda x:
                                              pd.to_datetime(str(x)).strftime("%Y-%m-%d"))
        return new_df

    @staticmethod
    def add_date(date, st, et):
        # date:TRADE_DAY对应获取的交易日数据
        # 对所获频率的日期加上开始和结束日
        new_date = pd.DataFrame({'date': [st, et]})
        new_date = new_date.append(date)
        new_date = new_date.drop_duplicates()
        add_date = new_date.sort_values(by=['date'], ascending=True)
        return add_date

    @staticmethod
    def get_time_diff(one_day, other_day):
        # 获取两个交易日之间相差的自然日天数
        min_day = pd.to_datetime(min([one_day, other_day]))
        max_day = pd.to_datetime(max([one_day, other_day]))
        return (max_day - min_day).days

    def get_last_trading_day(self, day):
        # 获取上一个交易日
        data = self.data
        last_day = data.loc[data['date'] < day]
        return last_day['date'].max()

    def get_next_trading_day(self, day):
        # 获取下一个交易日
        data = self.data
        last_day = data.loc[data['date'] > day]
        return last_day['date'].min()

    def get_week_day(self):
        # 获取区间对应的周度交易日日期
        data = self.data
        data['last'] = data['date'].shift(1)
        data['next'] = data['date'].shift(-1)
        new_data = data.loc[(data['date'] >= self.st) & (data['date'] <= self.et)]
        # 求时间差
        last_diff = []
        next_diff = []
        for num in range(len(new_data)):
            now = new_data['date'].values[num]
            last = new_data['last'].values[num]
            next = new_data['next'].values[num]
            last_diff.append(TRADE_DAY.get_time_diff(now, last))
            next_diff.append(TRADE_DAY.get_time_diff(now, next))
        new_data['next_diff'] = next_diff
        new_data['last_diff'] = last_diff
        me_df = new_data.loc[new_data['next_diff']>2]
        me_df = me_df.sort_values(by=['date'], ascending=True)
        out_df = pd.DataFrame({'date': me_df['date']})
        return out_df

2. 案例演示

2.1 获取前后交易日

   实现的方法主要是通过日期之间的比较来实现,比较简单。

if __name__ == '__main__':
    # 输入参数
    trade_date = ak.tool_trade_date_hist_sina()
    st, et = '2020-02-01', '2023-07-01'
    # 对原始数据进行转换

    data = TRADE_DAY.data_change(trade_date)
    Trade = TRADE_DAY(data, st, et)
    # 获取上一个交易日
    last_day = Trade.get_last_trading_day(st)
    # 获取下一个交易日
    next_day = Trade.get_next_trading_day(et)

   对应得到的结果为:

2.2 获取周度数据

   周度日期的提取思路如下:

1. 获取某个交易日与上一个交易日和下一个交易日的自然日天数差。

2. 筛选出情形1的数据。情形1对应的情况是:与上一个交易日的天数间隔为1,与下一个交易日的天数间隔大于2,。情形1比较常见,对应一些短期节假日和周末。

3. 筛选出情形2的数据。情形2对应的情况是:与上一个交易日的天数间隔不等于1,与下一个交易日的天数间隔大于2,。情形2比较少见,对应当周内只有一个交易日(国庆节后面那周)。

4. 总结下来周度日期的逻辑就是就是与下一个交易日的间隔日期大于2天。

  当然,获取周度还有许多办法(直接调取周度的大盘指数数据,对应得到的日期就是周频的),以上面是笔者自己的思路,仅供参考。

    # 获取周度交易日日期
    week_df = Trade.get_week_day()
    # 添加首尾的周度日期
    week_df_add = Trade.add_date(week_df, st, et)

  对应得到的结果为:

   本次内容分为两期,两期内容可以放在一个类中进行使用。

   本期分享到此结束,有何问题欢迎交流。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值