Replay is ok now

This commit is contained in:
jackyu66git
2025-06-10 18:46:42 +08:00
parent 2295a0b1f8
commit 747f74c1d1
3 changed files with 316 additions and 247 deletions
+7 -34
View File
@@ -25,7 +25,7 @@ class ChinaStockData:
# 设置较短的超时时间,避免长时间等待
import akshare as ak
print("正在获取A股股票列表...")
pass
# 尝试获取沪深A股实时行情,设置超时时间
try:
@@ -42,12 +42,11 @@ class ChinaStockData:
delattr(requests, 'timeout')
except Exception as network_error:
print(f"网络请求失败: {network_error}")
pass
# 网络失败时返回空列表,让调用方使用备用方案
return []
if stock_info is None or len(stock_info) == 0:
print("获取到的股票数据为空")
return []
# 增加到前2000只股票,提供更多选择
@@ -66,16 +65,13 @@ class ChinaStockData:
'amount': float(row['成交额']) if pd.notna(row['成交额']) else 0.0
})
except Exception as row_error:
print(f"处理股票数据行时出错: {row_error}")
continue
# 按成交金额排序,优先显示活跃股票
stock_list.sort(key=lambda x: x['amount'], reverse=True)
print(f"成功获取 {len(stock_list)} 只股票")
return stock_list
except Exception as e:
print(f"获取股票列表失败: {e}")
return []
def get_popular_stocks(self):
@@ -224,7 +220,7 @@ class ChinaStockData:
if '-' in end_date:
end_date = end_date.replace('-', '')
print(f"获取A股数据: {symbol}, 周期: {timeframe}, 开始: {start_date}, 结束: {end_date}")
pass
# 分批次获取数据以突破单次限制
all_data = []
@@ -252,7 +248,7 @@ class ChinaStockData:
current_end_dt = current_start_dt + timedelta(days=batch_days)
current_end = min(current_end_dt.strftime('%Y%m%d'), end_date)
print(f"批次 {iteration_count}: 获取 {current_start}{current_end} 的数据")
pass
try:
# 根据时间周期选择不同的API
@@ -294,13 +290,11 @@ class ChinaStockData:
df_batch = self.adjust_timestamp_for_trading_hours(df_batch, timeframe)
all_data.append(df_batch)
print(f"批次 {iteration_count}: 获取到 {len(df_batch)} 条记录")
else:
print(f"批次 {iteration_count}: 未获取到数据")
pass
except Exception as e:
print(f"批次 {iteration_count} 获取失败: {e}")
# 继续下一个批次
pass
# 更新下一批次的开始时间
current_start = (current_end_dt + timedelta(days=1)).strftime('%Y%m%d')
@@ -310,7 +304,6 @@ class ChinaStockData:
# 合并所有批次的数据
if not all_data:
print(f"未获取到任何数据: {symbol}")
return None
# 合并DataFrame
@@ -330,17 +323,13 @@ class ChinaStockData:
# 检查是否指定了明确的时间范围
if start_date and end_date:
# 如果指定了时间范围,优先返回完整的时间范围数据
print(f"用户指定了时间范围 {start_date}{end_date},返回完整数据 {len(df)} 条记录")
if len(df) > 10000: # 防止数据量过大,设置一个合理的上限
print(f"警告:数据量过大({len(df)}条),为保证性能将限制为最新的10000条记录")
df = df.tail(10000).reset_index(drop=True)
else:
# 如果没有指定时间范围,使用默认的limit限制
print(f"未指定明确时间范围,应用默认限制,返回最新的 {limit} 条记录")
df = df.tail(limit).reset_index(drop=True)
elif limit is None and len(df) > 10000:
# 即使没有limit限制,也要防止数据量过大影响性能
print(f"无limit限制但数据量过大({len(df)}条),为保证性能将限制为最新的10000条记录")
df = df.tail(10000).reset_index(drop=True)
# 添加技术指标
@@ -351,7 +340,6 @@ class ChinaStockData:
# 检查并处理任何剩余的NaN值
if df.isnull().any().any():
print("警告:发现NaN值,正在清理...")
# 对于数值列,用0填充NaN
numeric_cols = df.select_dtypes(include=[np.number]).columns
for col in numeric_cols:
@@ -367,12 +355,9 @@ class ChinaStockData:
for col in df.select_dtypes(include=[np.number]).columns:
df[col] = df[col].replace([np.inf, -np.inf], 0 if col != 'volume_ratio' else 1.0)
print(f"成功获取A股数据: {len(df)} 条记录 (共 {len(all_data)} 个批次)")
return df
except Exception as e:
print(f"获取A股数据失败: {e}")
traceback.print_exc()
return None
def add_indicators(self, df):
@@ -417,7 +402,6 @@ class ChinaStockData:
return df
except Exception as e:
print(f"添加指标失败: {e}")
return df
def search_stock(self, keyword):
@@ -478,7 +462,7 @@ class ChinaStockData:
break
except Exception as e:
print(f"全市场搜索失败: {e}")
pass
# 排序:优先显示代码匹配的结果
def sort_key(item):
@@ -495,7 +479,6 @@ class ChinaStockData:
return results[:20]
except Exception as e:
print(f"搜索股票失败: {e}")
return []
def get_stock_by_sector(self, sector=None):
@@ -514,7 +497,6 @@ class ChinaStockData:
sectors[sector_name].append(stock)
return sectors
except Exception as e:
print(f"获取行业股票失败: {e}")
return {} if sector is None else []
def get_all_sectors(self):
@@ -527,7 +509,6 @@ class ChinaStockData:
sectors.add(sector)
return sorted(list(sectors))
except Exception as e:
print(f"获取行业分类失败: {e}")
return []
def is_trading_day(self, date):
@@ -547,7 +528,6 @@ class ChinaStockData:
# 目前暂时只过滤周末
return True
except Exception as e:
print(f"判断交易日失败: {e}")
return True # 默认返回True,避免过度过滤
def is_trading_time(self, dt):
@@ -569,7 +549,6 @@ class ChinaStockData:
return ((morning_start <= time_str <= morning_end) or
(afternoon_start <= time_str <= afternoon_end))
except Exception as e:
print(f"判断交易时间失败: {e}")
return True # 默认返回True,避免过度过滤
def adjust_timestamp_for_trading_hours(self, df, timeframe):
@@ -605,8 +584,6 @@ class ChinaStockData:
return df.reset_index(drop=True)
except Exception as e:
print(f"调整A股时间戳失败: {e}")
traceback.print_exc()
return df
def get_trading_calendar(self, start_date, end_date):
@@ -627,7 +604,6 @@ class ChinaStockData:
return trading_days
except Exception as e:
print(f"获取交易日历失败: {e}")
# 如果获取失败,生成简单的工作日列表(排除周末)
trading_days = []
current = pd.to_datetime(start_date)
@@ -721,8 +697,6 @@ class ChinaStockData:
return df
except Exception as e:
print(f"填补交易时间间隙失败: {e}")
traceback.print_exc()
return df
def clean_a_stock_data(self, df, timeframe):
@@ -778,5 +752,4 @@ class ChinaStockData:
return df.reset_index(drop=True)
except Exception as e:
print(f"清理A股数据失败: {e}")
return df