superxu520 commited on
Commit
c349d48
·
1 Parent(s): c4a2fde

"feat:dynamic-check-today-data-availability"

Browse files
Files changed (1) hide show
  1. sync_data.py +73 -26
sync_data.py CHANGED
@@ -387,39 +387,86 @@ def get_target_daily(code: str, start_date: str, market: str) -> Optional[pd.Dat
387
  time.sleep(1)
388
  return None
389
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
390
  def get_last_trading_day() -> str:
391
- """获取最近一个交易日(优先使交易日历
392
 
393
- 注意由于数据在收盘后获取,如果今天是交易日但当前时间 < 20:00,
394
- 则返回前一个交易日,避免获取不完整的数据
 
 
395
  """
396
  now = get_beijing_time()
397
  today = now.date()
398
- current_hour = now.hour
399
 
400
- try:
401
- # 获取交易日历(新浪接口,包含未来日期)
402
- df = ak.tool_trade_date_hist_sina()
403
- if df is not None and not df.empty:
404
- # 转换为日期格式
405
- df['trade_date'] = pd.to_datetime(df['trade_date']).dt.date
406
-
407
- # 找到今天的交易日(如果今天是交易日)
408
- today_is_trading_day = today in df['trade_date'].values
409
-
410
- # 如果今天是交易日但当前时间 < 20:00,则排除今天
411
- if today_is_trading_day and current_hour < 20:
412
- last_day = df[df['trade_date'] < today]['trade_date'].iloc[-1]
413
- logger.info(f"Today is trading day but current time is {now.strftime('%H:%M')} (< 20:00), using previous trading day: {last_day}")
414
- else:
415
- # 否则使用 <= 今天的最后一个交易日
416
- last_day = df[df['trade_date'] <= today]['trade_date'].iloc[-1]
417
-
418
- return last_day.strftime('%Y-%m-%d')
419
- except Exception as e:
420
- logger.warning(f"Failed to get trading calendar: {e}")
 
 
 
 
421
 
422
- # 回退:使用指数行情
423
  try:
424
  df = ak.stock_zh_index_daily_em(symbol="sh000300")
425
  if df is not None and not df.empty:
 
387
  time.sleep(1)
388
  return None
389
 
390
+ def check_today_data_available() -> bool:
391
+ """
392
+ 探测当日数据是否已更新可用
393
+ 通过尝试获取一只活跃股票(平安银行 000001)的当日数据来判断
394
+
395
+ Returns:
396
+ True: 当日数据已可用
397
+ False: 当日数据尚未更新
398
+ """
399
+ try:
400
+ today = get_beijing_time().strftime('%Y%m%d')
401
+
402
+ # 优先使用 Tushare 探测
403
+ if TUSHARE_AVAILABLE:
404
+ try:
405
+ import tushare as ts
406
+ ts.set_token(TUSHARE_TOKENS[0])
407
+ pro = ts.pro_api()
408
+ df = pro.daily(ts_code='000001.SZ', trade_date=today)
409
+ if df is not None and not df.empty:
410
+ logger.debug(f"Tushare check: today data available")
411
+ return True
412
+ except Exception:
413
+ pass
414
+
415
+ # 回退到 AkShare 探测
416
+ try:
417
+ df = ak.stock_zh_a_spot_em()
418
+ if df is not None and not df.empty:
419
+ # 检查是否有今日数据
420
+ logger.debug(f"AkShare check: today data available")
421
+ return True
422
+ except Exception:
423
+ pass
424
+
425
+ except Exception as e:
426
+ logger.debug(f"Check today data failed: {e}")
427
+
428
+ return False
429
+
430
+
431
  def get_last_trading_day() -> str:
432
+ """获取最近一个交易日(通过探测数据可
433
 
434
+ 逻辑
435
+ 1. 先尝试获取当数据(探测 000001.SZ)
436
+ 2. 如果能获取到,说明当日数据已更新,返回今日
437
+ 3. 如果获取不到,说明当日数据未更新,返回上一个交易日
438
  """
439
  now = get_beijing_time()
440
  today = now.date()
441
+ today_str = today.strftime('%Y-%m-%d')
442
 
443
+ # 探测当日数据是否可用
444
+ logger.info(f"Checking if today ({today_str}) data is available...")
445
+
446
+ if check_today_data_available():
447
+ logger.info(f"Today data is available, using today: {today_str}")
448
+ return today_str
449
+ else:
450
+ # 获取上一个交易日
451
+ try:
452
+ # 使用交易日历获取上一个交易日
453
+ df = ak.tool_trade_date_hist_sina()
454
+ if df is not None and not df.empty:
455
+ df['trade_date'] = pd.to_datetime(df['trade_date']).dt.date
456
+ prev_trading_days = df[df['trade_date'] < today]['trade_date']
457
+ if not prev_trading_days.empty:
458
+ last_day = prev_trading_days.iloc[-1]
459
+ logger.info(f"Today data not available yet, using previous trading day: {last_day}")
460
+ return last_day.strftime('%Y-%m-%d')
461
+ except Exception as e:
462
+ logger.warning(f"Failed to get previous trading day: {e}")
463
+
464
+ # 回退:昨天
465
+ yesterday = (today - timedelta(days=1)).strftime('%Y-%m-%d')
466
+ logger.info(f"Using yesterday as fallback: {yesterday}")
467
+ return yesterday
468
 
469
+ # 备用:使用指数行情获取
470
  try:
471
  df = ak.stock_zh_index_daily_em(symbol="sh000300")
472
  if df is not None and not df.empty: