Replay is ok now
This commit is contained in:
+7
-34
@@ -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
|
||||
Reference in New Issue
Block a user