Spaces:
Running
Running
优化获取股票最新价格的函数,增加重试机制和错误处理,改进缓存逻辑以提高稳定性
Browse files- us_stock.py +40 -12
us_stock.py
CHANGED
|
@@ -155,8 +155,14 @@ def reduce_columns(df, columns_to_keep):
|
|
| 155 |
# 创建缓存字典
|
| 156 |
_price_cache = {}
|
| 157 |
|
| 158 |
-
def get_last_minute_stock_price(symbol: str) -> float:
|
| 159 |
-
"""获取股票最新价格,使用30
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 160 |
current_time = datetime.now()
|
| 161 |
|
| 162 |
# 检查缓存
|
|
@@ -166,17 +172,39 @@ def get_last_minute_stock_price(symbol: str) -> float:
|
|
| 166 |
if current_time - cached_time < timedelta(minutes=30):
|
| 167 |
return cached_price
|
| 168 |
|
| 169 |
-
#
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 178 |
|
| 179 |
-
return
|
| 180 |
|
| 181 |
# 返回个股历史数据
|
| 182 |
def get_stock_history(symbol, news_date, retries=10):
|
|
|
|
| 155 |
# 创建缓存字典
|
| 156 |
_price_cache = {}
|
| 157 |
|
| 158 |
+
def get_last_minute_stock_price(symbol: str, max_retries=3) -> float:
|
| 159 |
+
"""获取股票最新价格,使用30分钟缓存,并包含重试机制"""
|
| 160 |
+
|
| 161 |
+
if not symbol:
|
| 162 |
+
return -1.0
|
| 163 |
+
if symbol == "NONE_SYMBOL_FOUND":
|
| 164 |
+
return -1.0
|
| 165 |
+
|
| 166 |
current_time = datetime.now()
|
| 167 |
|
| 168 |
# 检查缓存
|
|
|
|
| 172 |
if current_time - cached_time < timedelta(minutes=30):
|
| 173 |
return cached_price
|
| 174 |
|
| 175 |
+
# 重试机制
|
| 176 |
+
for attempt in range(max_retries):
|
| 177 |
+
try:
|
| 178 |
+
# 缓存无效或不存在,从yfinance获取新数据
|
| 179 |
+
stock_data = yfinance.download(
|
| 180 |
+
symbol,
|
| 181 |
+
period='1d',
|
| 182 |
+
interval='5m',
|
| 183 |
+
progress=False, # 禁用进度条
|
| 184 |
+
timeout=10 # 设置超时时间
|
| 185 |
+
)
|
| 186 |
+
|
| 187 |
+
if stock_data.empty:
|
| 188 |
+
print(f"Warning: Empty data received for {symbol}, attempt {attempt + 1}/{max_retries}")
|
| 189 |
+
if attempt == max_retries - 1:
|
| 190 |
+
return -1.0
|
| 191 |
+
time.sleep(1) # 等待1秒后重试
|
| 192 |
+
continue
|
| 193 |
+
|
| 194 |
+
latest_price = float(stock_data['Close'].iloc[-1])
|
| 195 |
+
|
| 196 |
+
# 更新缓存
|
| 197 |
+
_price_cache[symbol] = (latest_price, current_time)
|
| 198 |
+
|
| 199 |
+
return latest_price
|
| 200 |
+
|
| 201 |
+
except Exception as e:
|
| 202 |
+
print(f"Error fetching price for {symbol}, attempt {attempt + 1}/{max_retries}: {str(e)}")
|
| 203 |
+
if attempt == max_retries - 1:
|
| 204 |
+
return -1.0
|
| 205 |
+
time.sleep(1) # 等待1秒后重试
|
| 206 |
|
| 207 |
+
return -1.0
|
| 208 |
|
| 209 |
# 返回个股历史数据
|
| 210 |
def get_stock_history(symbol, news_date, retries=10):
|