一个是实现获取以某天为基准日的交易日列表,比如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]))
以上代码可以实现按年从数据库中取数据然后存储,当然,稍加修改即可改为按月存取,可每日进行数据更新,也可一次性更新若干年的数据。