【股票量化进阶之路2】深圳A股主力资金筛选程序

# -*- coding: utf-8 -*-
"""
深圳A股主力资金筛选程序

功能:
1. 获取所有深圳A股股票列表
2. 筛选连续3日主力资金净流入(>=0.2)且5日累计净流入超过2亿元的股票
3. 将结果保存到以当前日期命名的CSV文件中

使用方法:
直接运行程序即可,结果将保存在当前目录下的YYYY-MM-DD_gem_fund_flow.csv文件中

@author: J-make
@date: 2025-05-12
@version: 1.0
"""

import akshare as ak
from datetime import datetime, timedelta
import pandas as pd
import time
import os

def get_gem_stocks():
    """获取所有深圳A股票列表
    
    Returns:
        list: 深圳A股票代码列表
    """
    stock_info = ak.stock_info_a_code_name()
    gem_stocks = stock_info[stock_info['code'].str.startswith('0')]  # 深圳A股代码以0开头
    return gem_stocks['code'].tolist()

def get_stock_fund_flow(stock_code):
    """获取单只股票的主力资金流数据并处理
    
    Args:
        stock_code (str): 股票代码
        
    Returns:
        DataFrame: 处理后的资金流数据(如果符合条件)
        None: 如果不符合条件或出错
    """
    try:
        df = ak.stock_individual_fund_flow(stock=stock_code, market="sz")  # 深圳A股在深交所
        if df.empty:
            return None
        
        latest = df.tail(5).copy()
        if len(latest) < 5:
            return None
        
        # 转换单位并计算
        latest['主力净流入(亿)'] = (latest['主力净流入-净额'] / 1e8).round(2)
        latest['日期'] = [datetime.now().date() - timedelta(days=i) for i in range(4, -1, -1)]  # 最近5个交易日
        
        # 检查条件
        if (latest['主力净流入(亿)'].head(3) >= 0.1).all():  # 连续3日净流入
            if latest['主力净流入(亿)'].sum() >= 1.5:  # 5日累计超过2亿
                return latest[['日期', '收盘价', '涨跌幅', '主力净流入(亿)']]
    except Exception as e:
        print(f"处理股票 {stock_code} 时出错: {e}")
    return None

def save_to_csv(selected_stocks):
    """将筛选结果保存到CSV文件
    
    Args:
        selected_stocks (list): 符合条件的股票列表
    """
    if not selected_stocks:
        print("没有符合条件的股票")
        return
    
    # 准备数据
    output_data = []
    for stock_code, data in selected_stocks:
        record = {
            '股票代码': stock_code,
            '最新收盘价': data['收盘价'].iloc[-1],
            '最新涨跌幅(%)': data['涨跌幅'].iloc[-1],
            '5日累计净流入(亿)': data['主力净流入(亿)'].sum().round(2),
            '第1日净流入(亿)': data['主力净流入(亿)'].iloc[0],
            '第2日净流入(亿)': data['主力净流入(亿)'].iloc[1],
            '第3日净流入(亿)': data['主力净流入(亿)'].iloc[2],
            '第4日净流入(亿)': data['主力净流入(亿)'].iloc[3],
            '第5日净流入(亿)': data['主力净流入(亿)'].iloc[4]
        }
        output_data.append(record)
    
    # 创建DataFrame
    output_df = pd.DataFrame(output_data)
    
    # 按累计净流入排序
    output_df = output_df.sort_values('5日累计净流入(亿)', ascending=False)
    
    # 生成文件名
    today_str = datetime.now().strftime("%Y-%m-%d")
    filename = f"{today_str}_gem_fund_flow_0.csv"
    
    # 保存文件
    output_df.to_csv(filename, index=False, encoding='utf_8_sig')  # 使用utf_8_sig编码支持中文
    print(f"\n筛选结果已保存到: {os.path.abspath(filename)}")

def main():
    """主程序"""
    print("开始获取深圳A股股票列表...")
    gem_stocks = get_gem_stocks()
    print(f"共找到 {len(gem_stocks)} 只深圳A股股票")
    
    selected_stocks = []
    
    print("\n开始筛选符合条件的股票...")
    for i, stock_code in enumerate(gem_stocks, 1):
        print(f"正在处理 {stock_code} ({i}/{len(gem_stocks)})...", end='\r\n')
        result = get_stock_fund_flow(stock_code)
        if result is not None:
            selected_stocks.append((stock_code, result))
            print(f"发现符合条件的股票: {stock_code}")
        time.sleep(0.001)  # 防止请求过于频繁
    
    # 输出结果到CSV
    save_to_csv(selected_stocks)
    
    # 打印汇总信息
    print("\n筛选完成!")
    print(f"共找到 {len(selected_stocks)} 只符合条件的深圳A股股票")

if __name__ == "__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值