fix: 修复 collector_loop 常量名(NameError)并填充核心股所属题材
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import traceback
|
||||||
from datetime import datetime, time as dtime, timezone, timedelta
|
from datetime import datetime, time as dtime, timezone, timedelta
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
@@ -12,7 +13,7 @@ from services.themes import fetch_theme_list
|
|||||||
|
|
||||||
_CST = timezone(timedelta(hours=8))
|
_CST = timezone(timedelta(hours=8))
|
||||||
|
|
||||||
# 每天采集的后台任务:每 CHECK_INTERVAL 分钟检查一次
|
# 每天采集的后台任务:每 300 秒(5 分钟)检查一次
|
||||||
CHECK_INTERVAL_SECONDS = 300
|
CHECK_INTERVAL_SECONDS = 300
|
||||||
COLLECT_AFTER_TIME = dtime(15, 0) # 收盘后 15:00 开始允许采集
|
COLLECT_AFTER_TIME = dtime(15, 0) # 收盘后 15:00 开始允许采集
|
||||||
CORE_STOCK_LIMIT = 100 # 核心股前100
|
CORE_STOCK_LIMIT = 100 # 核心股前100
|
||||||
@@ -20,7 +21,7 @@ TOP_THEME_LIMIT = 10 # 题材前10
|
|||||||
|
|
||||||
|
|
||||||
def _is_trading_day(d: datetime) -> bool:
|
def _is_trading_day(d: datetime) -> bool:
|
||||||
"""周一至周五视为交易日(与 themes._is_trading_time 一致,不处理法定节假日)"""
|
"""仅按工作日判断:周一至周五视为交易日,不处理法定节假日"""
|
||||||
return d.weekday() < 5
|
return d.weekday() < 5
|
||||||
|
|
||||||
|
|
||||||
@@ -88,6 +89,15 @@ async def collect_daily(trade_date: str, dry_run: bool = False) -> dict:
|
|||||||
"INSERT OR IGNORE INTO daily_core_stocks (trade_date, stock_code, stock_name, f3, rank) VALUES (?,?,?,?,?)",
|
"INSERT OR IGNORE INTO daily_core_stocks (trade_date, stock_code, stock_name, f3, rank) VALUES (?,?,?,?,?)",
|
||||||
(trade_date, s["stock_code"], s["stock_name"], s["f3"], i),
|
(trade_date, s["stock_code"], s["stock_name"], s["f3"], i),
|
||||||
)
|
)
|
||||||
|
# 核心股所属题材:从 themes 列表(含 securityCode/themeCode/themeName)中
|
||||||
|
# 为每个核心股收集其全部所属题材,写入 daily_core_stock_themes
|
||||||
|
core_codes = {s["stock_code"] for s in core_stocks}
|
||||||
|
for t in themes:
|
||||||
|
if t.get("securityCode") in core_codes:
|
||||||
|
conn.execute(
|
||||||
|
"INSERT OR IGNORE INTO daily_core_stock_themes (trade_date, stock_code, theme_code, theme_name) VALUES (?,?,?,?)",
|
||||||
|
(trade_date, t["securityCode"], t["themeCode"], t["themeName"]),
|
||||||
|
)
|
||||||
for i, t in enumerate(top_themes, start=1):
|
for i, t in enumerate(top_themes, start=1):
|
||||||
conn.execute(
|
conn.execute(
|
||||||
"INSERT OR IGNORE INTO daily_top_themes (trade_date, theme_code, theme_name, bf3, hot_rank, rank) VALUES (?,?,?,?,?,?)",
|
"INSERT OR IGNORE INTO daily_top_themes (trade_date, theme_code, theme_name, bf3, hot_rank, rank) VALUES (?,?,?,?,?,?)",
|
||||||
@@ -110,8 +120,9 @@ async def collector_loop(stop: Optional[asyncio.Event] = None) -> None:
|
|||||||
trade_date = now.strftime("%Y-%m-%d")
|
trade_date = now.strftime("%Y-%m-%d")
|
||||||
if not _has_collected(trade_date):
|
if not _has_collected(trade_date):
|
||||||
await collect_daily(trade_date)
|
await collect_daily(trade_date)
|
||||||
except Exception as e:
|
except Exception:
|
||||||
print(f"[collector] 采集异常: {e}")
|
print("[collector] 采集异常:")
|
||||||
|
traceback.print_exc()
|
||||||
if stop is not None and stop.is_set():
|
if stop is not None and stop.is_set():
|
||||||
break
|
break
|
||||||
await asyncio.sleep(_CHECK_INTERVAL_SECONDS)
|
await asyncio.sleep(CHECK_INTERVAL_SECONDS)
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ async def collector_loop(stop: Optional[asyncio.Event] = None) -> None:
|
|||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
now = datetime.now(_CST)
|
now = datetime.now(_CST)
|
||||||
if _is_trading_day(now) and now.time() >= _COLLECT_AFTER_TIME:
|
if _is_trading_day(now) and now.time() >= COLLECT_AFTER_TIME:
|
||||||
trade_date = now.strftime("%Y-%m-%d")
|
trade_date = now.strftime("%Y-%m-%d")
|
||||||
if not _has_collected(trade_date):
|
if not _has_collected(trade_date):
|
||||||
await collect_daily(trade_date)
|
await collect_daily(trade_date)
|
||||||
@@ -219,7 +219,7 @@ async def collector_loop(stop: Optional[asyncio.Event] = None) -> None:
|
|||||||
print(f"[collector] 采集异常: {e}")
|
print(f"[collector] 采集异常: {e}")
|
||||||
if stop is not None and stop.is_set():
|
if stop is not None and stop.is_set():
|
||||||
break
|
break
|
||||||
await asyncio.sleep(_CHECK_INTERVAL_SECONDS)
|
await asyncio.sleep(CHECK_INTERVAL_SECONDS)
|
||||||
```
|
```
|
||||||
|
|
||||||
> 注:上面代码中 `_CORE_STOCK_LIMIT` 应为 `CORE_STOCK_LIMIT`(变量名一致),下面 Step 2 统一修正。
|
> 注:上面代码中 `_CORE_STOCK_LIMIT` 应为 `CORE_STOCK_LIMIT`(变量名一致),下面 Step 2 统一修正。
|
||||||
|
|||||||
Reference in New Issue
Block a user