This commit is contained in:
jackyu66git
2025-06-18 00:56:41 +08:00
parent 3dc7dd5322
commit de756e38eb
3 changed files with 338 additions and 53 deletions
+16 -6
View File
@@ -186,11 +186,18 @@ class ChinaStockData:
"""将时间周期转换为akshare的period参数"""
mapping = {
'1m': '1', # 1分钟
'3m': '5', # 3分钟 (A股不支持3分钟,使用5分钟替代)
'5m': '5', # 5分钟
'15m': '15', # 15分钟
'30m': '30', # 30分钟
'1h': '60', # 60分钟
'2h': '60', # 2小时 (A股不支持2小时,使用1小时替代)
'4h': '60', # 4小时 (A股不支持4小时,使用1小时替代)
'6h': '60', # 6小时 (A股不支持6小时,使用1小时替代)
'8h': '60', # 8小时 (A股不支持8小时,使用1小时替代)
'12h': '60', # 12小时 (A股不支持12小时,使用1小时替代)
'1d': 'daily', # 日线
'3d': 'daily', # 3日 (A股不支持3日,使用日线替代)
'1w': 'weekly',# 周线
'1M': 'monthly'# 月线
}
@@ -235,7 +242,7 @@ class ChinaStockData:
# 分钟级数据,每次获取7天
batch_days = 7
elif period == '60':
# 小时级数据,每次获取30天
# 小时级数据(所有小时级别都映射到60分钟),每次获取30天
batch_days = 30
else:
# 日线及以上,每次获取365天
@@ -587,7 +594,7 @@ class ChinaStockData:
df['date'] = df['date'].dt.normalize() + pd.Timedelta(hours=15)
# 对于分钟级数据,过滤非交易时间的数据
elif timeframe in ['1m', '5m', '15m', '30m', '1h']:
elif timeframe in ['1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '8h', '12h']:
# 过滤交易日
df = df[df['date'].apply(self.is_trading_day)]
@@ -651,7 +658,7 @@ class ChinaStockData:
return df
# 对于分钟级数据,创建完整的交易时间序列
if timeframe in ['1m', '5m', '15m', '30m', '1h']:
if timeframe in ['1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '8h', '12h']:
# 获取数据的开始和结束时间
start_date = df['date'].min().date()
end_date = df['date'].max().date()
@@ -660,8 +667,11 @@ class ChinaStockData:
complete_times = []
current_date = start_date
# 获取时间间隔(分钟)
freq_map = {'1m': 1, '5m': 5, '15m': 15, '30m': 30, '1h': 60}
# 获取时间间隔(分钟)- 注意A股新增的时间周期都映射到了已有的时间间隔
freq_map = {
'1m': 1, '3m': 5, '5m': 5, '15m': 15, '30m': 30,
'1h': 60, '2h': 60, '4h': 60, '6h': 60, '8h': 60, '12h': 60
}
freq_minutes = freq_map.get(timeframe, 5)
while current_date <= end_date:
@@ -769,7 +779,7 @@ class ChinaStockData:
df[col] = df[col].replace([np.nan, np.inf, -np.inf], 0)
# 确保时间序列连续性(仅对分钟级数据)
if timeframe in ['1m', '5m', '15m', '30m', '1h']:
if timeframe in ['1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '8h', '12h']:
df = self.fill_trading_gaps(df, timeframe)
# 最后再次检查并清理任何剩余的NaN值