1. 近5日涨幅股票筛选实现
当前需要通过每日股票行情数据,筛选近5日或10日涨幅超过10%的股票, 下面是相关的实现代码。
import pandas as pd
# 模拟股票行情数据(可以用Tushare/Akshare替换为真实数据)
# 生成AAPL和MSFT两只股票近15天的行情数据
data = {
'symbol': ['AAPL']*15 + ['MSFT']*15,
'date': pd.date_range(end='2023-12-31', periods=15).tolist()*2,
'close': [
170, 172, 175, 177, 180, # AAPL前5天
185, 190, 195, 200, 205, # 中间5天(涨幅21.4%)
210, 208, 212, 215, 220, # 最后5天(近5日涨幅7.3%)
300, 305, 310, 308, 315, # MSFT前5天
320, 325, 330, 335, 340, # 中间5天
345, 350, 355, 360, 375 # 最后5天(近5日涨幅9.4%,近10日涨幅21.4%)
]
}
df = pd.DataFrame(data).sort_values(['symbol', 'date'])
def calculate_returns(df, days=5):
"""计算指定天数的涨幅"""
return df.groupby('symbol')['close'].apply(
lambda x: x.pct_change(periods=days-1).iloc[-1] * 100
)
# 计算5日和10日涨幅
returns_5d = calculate_returns(df, days=5)
returns_10d = calculate_returns(df, days=10)
# 筛选条件
condition = (returns_5d > 10) | (returns_10d > 10)
selected_stocks = returns_5d[condition].index.tolist()
print("满足条件的股票:", selected_stocks)
代码说明:
-
数据准备:
- 生成包含两个股票(AAPL和MSFT)15个交易日的示例数据
- 数据按股票代码和日期排序(真实数据需替换data变量)
核心函数:
def calculate_returns(df, days=5):
"""
计算指定天数的涨幅
@:param df:股票行情数据
@:param days: 交易日, 默认为5天
"""
return df.groupby('symbol')['close'].apply(
# 计算指定天数的涨幅
lambda x: x.pct_change(periods=days - 1).iloc[-1] * 100
)
- 使用groupby按股票分组
- pct_change计算指定交易日的收益率
- iloc[-1]取最新交易日的涨幅
- 筛选逻辑:
- 5日涨幅:returns_5d > 10
- 10日涨幅:returns_10d > 10
- 使用|运算符实现"或"条件
2. 高级功能扩展
- 可视化图表展示
import matplotlib.pyplot as plt
# 设置全局字体, 避免中文乱码
matplotlib.rcParams['font.family'] = ['SimHei'] # 使用黑体
matplotlib.rcParams['axes.unicode_minus'] = False # 正确显示负号
def gen_plot(returns):
# 生成图表
plt.figure(figsize=(10, 6))
returns.plot(kind='barh', color=['skyblue', 'salmon'])
plt.axvline(x=10, color='r', linestyle='--')
plt.title('股票涨幅分析')
plt.xlabel('涨幅百分比 (%)')
plt.ylabel('股票代码')
plt.show()
gen_plot(pd.DataFrame({'5日': returns_5d, '10日': returns_10d}))

生成图表
- 数据校验增强
def validate_data(df):
# 检查数据完整性
assert not df.duplicated(subset=['symbol', 'date']).any(), "存在重复数据"
assert df['close'].notnull().all(), "存在缺失收盘价"
# 检查交易连续性
date_counts = df.groupby('symbol')['date'].apply(lambda x: x.diff().dt.days.dropna())
assert (date_counts == 1).all(), "存在非连续交易日"
3. 注意事项
-
数据需要满足以下条件:
- 包含symbol(股票代码)、date(日期)、close(收盘价)字段
- 按日期升序排列(最旧日期在前)
- 每个股票至少有N+1个数据点(计算N日涨幅)
特殊场景处理建议:
- 停牌股票:使用ffill填充停牌日数据
df = df.set_index('date').groupby('symbol').resample('D').ffill().reset_index()
- 新股上市:过滤数据不足的股票
min_days = max(days_list)
valid_symbols = df.groupby('symbol').filter(lambda x: len(x) >= min_days)['symbol'].unique()