Python实现近五日涨幅股票筛选

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)

代码说明:

  1. 数据准备:

    • 生成包含两个股票(AAPL和MSFT)15个交易日的示例数据
    • 数据按股票代码和日期排序(真实数据需替换data变量)
  2. 核心函数:

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]取最新交易日的涨幅
  1. 筛选逻辑:
  • 5日涨幅:returns_5d > 10
  • 10日涨幅:returns_10d > 10
  • 使用|运算符实现"或"条件

2. 高级功能扩展

  1. 可视化图表展示
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}))
生成图表
  1. 数据校验增强
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. 注意事项

  1. 数据需要满足以下条件:

    • 包含symbol(股票代码)、date(日期)、close(收盘价)字段
    • 按日期升序排列(最旧日期在前)
    • 每个股票至少有N+1个数据点(计算N日涨幅)
  2. 特殊场景处理建议:

  • 停牌股票:使用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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容