admin
9 小时以前 ba2c3891780d9ac760371a3ba8578cb031f5d48f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import json
import os.path
 
import constant
from utils import tool, hx_qc_value_util
 
 
@tool.singleton
class TradingDatesManager:
 
    def __init__(self):
        self.__trading_dates = []
        self.load_data()
 
    def get_trading_dates(self):
        return self.__trading_dates
 
    def load_data(self):
        """
        从文件中加载交易日期
        :return:
        """
        if not os.path.exists(constant.TRADING_DATES_PATH):
            return
        with open(constant.TRADING_DATES_PATH, mode='r', encoding='utf-8') as f:
            datas = json.load(f)
            self.__trading_dates = datas
 
    def get_pre_trading_day(self, now_day):
        """
        获取前一个交易日
        :return:
        """
        for day in reversed(self.__trading_dates):
            if day < now_day:
                return day
        return None
 
    def get_next_trading_day(self, now_day):
        """
        获取后一个交易日
        :return:
        """
        for day in self.__trading_dates:
            if day > now_day:
                return day
        return None
 
    # 获取多个交易日
    def get_pres_trading_days(self, now_day, count):
        """
        获取当前日期的前 count 个交易日(从近到远排序)。
 
        :param now_day: 当前日期(datetime.date 或 datetime.datetime)
        :param count: 需要获取的交易日数量(正整数)
        :return: 日期列表,例如 [前1个交易日, 前2个交易日, ...]
        :raises: ValueError 如果 get_pre_trading_day() 返回无效值或 count 非法
        """
 
        days = []
        temp = now_day
        for _ in range(count):
            temp = self.get_pre_trading_day(temp)
            if temp is None:
                print(f"get_pre_trading_day() 返回无效值")
            days.append(temp)
        return days
 
    @classmethod
    def update_trading_dates(cls):
        """
        更新交易日历
        :return: 日期列表
        """
        # 获取前后10个交易日的数据
        dates = []
        now_day = tool.get_now_date_str()
        for i in range(100):
            day = hx_qc_value_util.get_previous_trading_date(now_day)
            dates.append(day)
            now_day = day
        dates.sort()
        now_day = dates[-1]
        for i in range(10):
            day = hx_qc_value_util.get_next_trading_date(now_day)
            dates.append(day)
            now_day = day
        dates.sort()
        if dates:
            with open(constant.TRADING_DATES_PATH, mode='w', encoding='utf-8') as f:
                f.write(json.dumps(dates))
        return dates