python实现将所有交易数据按年分组存取的核心逻辑

一个是实现获取以某天为基准日的交易日列表,比如0305,如果交易日中有0305则0305作为最后交易日放置于交易日列表。如果0305不在交易日列表中,则取0305后一个交易日为最终交易日,放置在交易日列表中。此逻辑是为了实现某个交易日之前N个交易日的相关数据所做的准备。

相关程序:

from typing import List
trading_days = [20230101, 20230102, 20230605, 20230708, 20230805, 20231231, 20240101, 20240102, 20240131,
                20240203, 20240205, 20240305, 20240507, 20240819]

# b = [datetime.strptime(str(i), "%Y%m%d") for i in a]
# print(b)

def get_trading_days(trading_days, date, days) -> List[int]:
    """
    trading_days: 给定交易日列表
    date: 给定的数字日期
    days: 应返回的实际交易日列表长度
    返回:实际的交易日列表和最后交易日组成的新列表
    获取交易日列表
    逻辑:当给定日在交易日当中,给定日作为最后一个交易日,附在交易日列表的最后一位,
    给定的交易日不在列表中,取给定日后的交易日作为最后交易日,附在交易日列表的最后一位
    """
    trading_days_set = set(trading_days)

    # 检查给定日期是否为交易日
    if date in trading_days_set:
        # 查找给定日期的前三个交易日
        previous_days = [x for x in trading_days if x < date][-days:]
        # 将当天日期添加到结果中
        previous_days.append(date)
        return previous_days
    else:
        # 查找小于给定日期的最近的三个交易日
        lower_days = [x for x in trading_days if x < date]
        lower_days = sorted(lower_days)[-days:]

        # 查找大于给定日期的最近的一个交易日
        higher_day = min([x for x in trading_days if x > date], default=None)
        if higher_day:
            lower_days.append(higher_day)
        return lower_days

# 调用函数并打印结果
print(get_trading_days(trading_days, 20230401, 3))
print(get_trading_days(trading_days, 20230605, 3))
print(get_trading_days(trading_days, 20230708, 3))
print(get_trading_days(trading_days, 20230709, 3))

接下来的程序是在前基础上做的进一步分化,比如交易日太多,超过年的,我们要按年取(当然,按此类推,也可按月存取),逻辑很简单,先定义一个类,用来记录跨年的开始日期和结束日期

class DateRange:
    def __init__(self, begin, end):
        self.begin = begin
        self.end = end

    def __str__(self):
        return f"YearRange: [{self.begin} --> {self.end}]"
    def __repr__(self):
        return self.__str__()

然后从交易日列表开始,第0个开始认为开始日期和结束日期相同,并将之加入跨年列表中,然后找到年份不同的,更新结束日期并开始新的开始日期,直到达到最后一个之前的列表。

当列表长度大于1时,将列表最后一个元素更新到跨年列表的end值。

代码如下:

def find_year_range(dates: List[int]) -> List[DateRange]:
    """查找交易日列表中的交易时段,当前指以年为单位的交易时段"""
    year_ranges = []
    # 年份的格式转换函数
    def get_year(date):
        return date // 10000

    for i in range(0, len(dates)-1):
        year = get_year(dates[i])
        if i == 0:  # 开始先把第1条记录记为开始年
            year_ranges.append(DateRange(dates[i], dates[i]))
        elif year != get_year(year_ranges[-1].end):
            year_ranges[-1].end = dates[i]  # 更新后一年
            year_ranges.append(DateRange(dates[i], dates[i]))
    if year_ranges:
        year_ranges[-1].end = dates[-1]
    return year_ranges


print(find_year_range([20230401, 20230405, 20230605, 20230708]))
print(find_year_range([20230401, 20230405, 20230605, 20230708, 20240102]))
print(find_year_range([20230401, 20230405, 20230605, 20230708, 20240102,20250305,20260305,20260708,20270909]))

以上代码可以实现按年从数据库中取数据然后存储,当然,稍加修改即可改为按月存取,可每日进行数据更新,也可一次性更新若干年的数据。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值