概念板块重做

This commit is contained in:
2026-01-05 18:17:35 +08:00
parent f761145a1a
commit afa8be8112
2 changed files with 53 additions and 37 deletions

View File

@@ -723,6 +723,32 @@ SYWG_INDUSTRY_CACHE = {
5: {} # level5: 四级行业
}
# 交易日缓存(从 tdays.csv 加载)
TRADING_DAYS_SET = set()
def load_trading_days():
"""从 tdays.csv 加载交易日数据到内存"""
global TRADING_DAYS_SET
csv_path = os.path.join(os.path.dirname(__file__), 'tdays.csv')
try:
with open(csv_path, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
next(reader) # 跳过表头
for row in reader:
if row:
# 解析日期格式 2010/1/4 -> date 对象
date_str = row[0].strip()
parts = date_str.split('/')
if len(parts) == 3:
year, month, day = int(parts[0]), int(parts[1]), int(parts[2])
TRADING_DAYS_SET.add(datetime(year, month, day).date())
print(f"[交易日] 已加载 {len(TRADING_DAYS_SET)} 个交易日 (范围: {min(TRADING_DAYS_SET)} ~ {max(TRADING_DAYS_SET)})")
except Exception as e:
print(f"[交易日] 加载 tdays.csv 失败: {e}")
# 启动时加载交易日
load_trading_days()
# 初始化扩展
db = SQLAlchemy(app)
mail = Mail(app)
@@ -4453,7 +4479,7 @@ def api_event_related_stocks(event_id):
event_time = event.start_time if event.start_time else event.created_at
current_time = datetime.now()
# 定义交易日和时间范围计算函数(与 app.py 中的逻辑完全一致
# 定义交易日和时间范围计算函数(使用内存中的 TRADING_DAYS_SET
def get_trading_day_and_times(event_datetime):
event_date = event_datetime.date()
event_time_only = event_datetime.time()
@@ -4462,44 +4488,34 @@ def api_event_related_stocks(event_id):
market_open = dt_time(9, 30)
market_close = dt_time(15, 0)
with engine.connect() as conn:
# First check if the event date itself is a trading day
is_trading_day = conn.execute(text("""
SELECT 1
FROM trading_days
WHERE EXCHANGE_DATE = :date
"""), {"date": event_date}).fetchone() is not None
def get_next_trading_day(from_date):
"""从 TRADING_DAYS_SET 获取下一个交易日"""
# 最多查找 30 天
for i in range(1, 31):
next_date = from_date + timedelta(days=i)
if next_date in TRADING_DAYS_SET:
return next_date
return None
if is_trading_day:
# If it's a trading day, determine time period based on event time
if event_time_only < market_open:
# Before market opens - use full trading day
return event_date, market_open, market_close
elif event_time_only > market_close:
# After market closes - get next trading day
next_trading_day = conn.execute(text("""
SELECT EXCHANGE_DATE
FROM trading_days
WHERE EXCHANGE_DATE > :date
ORDER BY EXCHANGE_DATE LIMIT 1
"""), {"date": event_date}).fetchone()
# Convert to date object if we found a next trading day
return (next_trading_day[0].date() if next_trading_day else None,
market_open, market_close)
else:
# During trading hours
return event_date, event_time_only, market_close
# 检查事件日期是否是交易日
is_trading_day = event_date in TRADING_DAYS_SET
if is_trading_day:
# If it's a trading day, determine time period based on event time
if event_time_only < market_open:
# Before market opens - use full trading day
return event_date, market_open, market_close
elif event_time_only > market_close:
# After market closes - get next trading day
next_trading_day = get_next_trading_day(event_date)
return (next_trading_day, market_open, market_close)
else:
# If not a trading day, get next trading day
next_trading_day = conn.execute(text("""
SELECT EXCHANGE_DATE
FROM trading_days
WHERE EXCHANGE_DATE > :date
ORDER BY EXCHANGE_DATE LIMIT 1
"""), {"date": event_date}).fetchone()
# Convert to date object if we found a next trading day
return (next_trading_day[0].date() if next_trading_day else None,
market_open, market_close)
# During trading hours
return event_date, event_time_only, market_close
else:
# If not a trading day, get next trading day
next_trading_day = get_next_trading_day(event_date)
return (next_trading_day, market_open, market_close)
trading_day, start_time, end_time = get_trading_day_and_times(event_time)