# -*- 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()