Date 模块架构
1. 模块架构图
┌─────────────────────────────────────────────────────────────┐
│ Date 模块 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────────────────┐ │
│ │ timestamp.py │ │ trade.py │ │
│ ├─────────────────┤ ├─────────────────────────────┤ │
│ │ 时间戳转换 │ │ 交易日算法 │ │
│ │ • Unix时间戳 │ │ • is_trade判断 │ │
│ │ • datetime互转 │ │ • next/prev trade date │ │
│ │ • 字符串格式化 │ │ • trade gap计算 │ │
│ │ • 通达信格式 │ │ • 二分查找优化 │ │
│ └─────────────────┘ └─────────────────────────────┘ │
│ │ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ trade_dates_data.py │ │
│ │ (TRADE_DATE_SSE 列表) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘2. 核心组件
2.1 timestamp.py 组件
timestamp.py
├── 时区常量
│ └── QATZInfo_CN = 'Asia/Shanghai'
├── Unix时间戳转换
│ ├── util_datetime_to_Unix_timestamp() # datetime → Unix
│ ├── util_str_to_Unix_timestamp() # 字符串 → Unix
│ └── util_timestamp_to_str() # Unix → 字符串
├── datetime互转
│ ├── util_str_to_datetime() # 字符串 → datetime
│ ├── util_stamp2datetime() # 时间戳 → datetime
│ └── util_to_datetime() # 通用 → datetime
├── 日期字符串操作
│ ├── util_date_str2int() # "2026-04-03" → 20260403
│ ├── util_date_int2str() # 20260403 → "2026-04-03"
│ ├── util_datetime_to_strdate() # datetime → "YYYY-MM-DD"
│ ├── util_datetime_to_strdatetime() # datetime → "YYYY-MM-DD HH:MM:SS"
│ └── util_today_str() # 今日 → "YYYY-MM-DD"
├── 验证函数
│ └── util_date_valid() # 验证日期格式
└── 辅助函数
├── util_print_timestamp() # 友好格式打印
├── util_tdxtimestamp() # 通达信时间戳
├── util_select_hours() # 小时筛选
├── util_select_min() # 分钟筛选
├── util_time_delay() # 时间延迟
├── util_calc_time() # 时间差计算
└── month_data() # 月度数据列表2.2 trade.py 组件
trade.py
├── 核心数据结构
│ └── trade_date_sse # A股全年交易日列表
├── 交易日判断
│ └── util_if_trade() # O(1) 查询
├── 交易日获取
│ ├── util_get_next_trade_date() # 后n个交易日
│ ├── util_get_pre_trade_date() # 前n个交易日
│ └── util_get_real_date() # 最近交易日(二分查找)
├── 交易时间判断
│ └── util_if_tradetime() # A股/期货交易时间
├── 日期偏移
│ ├── util_get_next_day() # 日历日后n天
│ ├── util_get_last_day() # 日历日前n天
│ └── util_date_gap() # 交易日偏移
├── 间隔计算
│ ├── util_get_trade_gap() # 交易日间隔天数
│ └── util_date_gap() # 交易日偏移计算
├── 周期计算
│ ├── util_get_next_period() # 下一周期起始
│ ├── util_get_next_datetime() # 几天后交易时间
│ └── util_get_last_datetime() # 几天前交易时间
├── 日期范围
│ ├── util_get_real_datelist() # 真实起止日期
│ ├── util_get_trade_range() # 交易日范围列表
│ └── util_get_trade_datetime() # 真实交易日期
├── 月度/季度
│ ├── util_getBetweenMonth() # 月份区间
│ ├── util_getBetweenQuarter() # 季度区间
│ └── util_add_months() # 月份偏移
└── 其他
├── util_week_end_day() # 周末最后交易日
├── get_weekday_list() # 固定星期列表
└── trade_date_sse # 交易日数据3. 数据流
3.1 交易日查询流程
用户输入日期
│
▼
util_if_trade("2026-04-03")
│
▼
normalize = "2026-04-03" # 标准化处理
│
▼
查询 trade_date_sse (list)
│
▼
返回 True/False3.2 下一交易日查询流程
用户输入日期
│
├─── 日期在列表中? ───┬ YES ──→ index + n ──→ 返回 trade_date_sse[index]
│ │
│ NO
│ │
▼ ▼
util_get_real_date() 二分查找定位
(向左找最近的) │
│ │
└──────────┬──────────────┘
▼
index + n
│
▼
返回 trade_date_sse[index]4. 性能设计
4.1 二分查找优化
util_get_real_date() 使用 bisect.bisect_left() 实现 O(log n) 查找:
python
pos = bisect.bisect_left(trade_list, date_str)
if towards == -1:
return trade_list[pos - 1] # 向左找
else:
return trade_list[pos] # 向右找4.2 交易日列表
- 使用预生成的
TRADE_DATE_SSE列表 - 列表元素:
List[str]格式 "YYYY-MM-DD" - 数据范围:1990-12-19(上证成立)至今
5. 依赖关系
FQBase.Date
├── Python 标准库
│ ├── datetime
│ ├── time
│ ├── calendar
│ ├── bisect
│ └── typing
├── 第三方库
│ ├── pandas (Timestamp转换)
│ ├── numpy (类型支持)
│ └── dateutil (relativedelta)
└── FQBase 内部
└── FQBase.Config.business.constants (MARKET_TYPE, FREQUENCE)