打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python 金融数据抓取与筛选:构建高质量股票投资组合

在金融投资领域,Python 以其强大的数据处理能力和丰富的第三方库支持,为投资者提供了便捷、高效的市场数据获取与分析手段。本文将以一段代码为例,详解如何使用 Python 进行股票实时行情获取、关键指标筛选、多维度排名打分以及最终生成一份高质量的投资组合。我们将主要运用以下几个库:

  • efinance: 用于获取金融数据。
  • pandas: 数据处理、清洗与分析。
  • datetime: 时间日期处理。
  • time: 计时与性能评估。

一、实时行情数据获取与存储

  1. 导入所需库:首先导入 efinance 以获取实时股票行情,同时引入 time、datetime、os 和 pandas 以支持后续数据处理。
import time, datetime
import os
import efinance.stock as ef
import pandas as pd
  1. 计时开始:使用 time.perf_counter() 记录程序开始时间,便于后续计算运行耗时。
a = time.perf_counter()
  1. 获取实时行情:调用 efinance.stock.get_realtime_quotes() 函数获取当前股票实时行情数据,并将其存储在变量 quotes 中。
quotes = ef.get_realtime_quotes()
  1. 数据存储:将实时行情数据保存为 CSV 文件,便于后续分析与查阅。首先确定用户桌面路径,然后拼接文件名,使用 to_csv() 方法将数据写入指定位置。
desktop_path = os.path.join(os.path.expanduser('~'), 'Desktop')
csv_path = os.path.join(desktop_path, '10到300.csv')
quotes.to_csv(csv_path, index=False, encoding='utf-8-sig')
  1. 查看数据:打印实时行情数据的前三行,直观了解数据结构。
print(quotes.head(3))

二、公司财务指标获取与合并

  1. 获取财务指标:调用 efinance.stock.get_all_company_performance() 函数获取所有公司的财务指标数据,存储在变量 performance 中。
performance = ef.get_all_company_performance()
  1. 财务指标存储:将财务指标数据保存为另一个 CSV 文件,以便后续操作。
csv_path1 = os.path.join(desktop_path, '股票指标.csv')
performance.to_csv(csv_path1, index=False, encoding='utf-8-sig')
  1. 指标数据补充:读取先前保存的“股票指标”CSV 文件,将其与 performance 中的关键财务指标(如净利润、每股收益、净资产收益率等)合并到同一 DataFrame 中。
df = pd.read_csv(csv_path1, encoding='utf-8-sig', dtype={'股票代码': str})
df['净利润'] = performance['净利润']
df['每股收益'] = performance['每股收益']
df['净资产收益率'] = performance['净资产收益率']
df['销售毛利率'] = performance['销售毛利率']
df['营业收入同比增长'] = performance['营业收入同比增长']
df.to_csv(csv_path1, encoding='utf-8-sig')

三、筛选与优化投资组合

  1. 数据合并:将财务指标数据与原始实时行情数据('10到300.csv')进行合并,依据股票代码作为连接键,保留所有列。
csv_path2 = os.path.join(desktop_path, '10到300.csv')
df1 = pd.read_csv(csv_path2, encoding='utf-8-sig', dtype={'股票代码': str})
df1 = df1.merge(df, on='股票代码', how='left')
df1.to_csv(csv_path2, index=False, encoding='utf-8-sig')
  1. 数据类型转换与处理:将“总市值”字段中的缺失值替换为 NaN,并转换为浮点型;筛选出总市值在 10 亿到 300 亿之间的股票;去除股票名称中含有 'S' 或 '*' 字符,以及股票代码以 '688', '8', '4' 开头的股票。
df1['总市值'] = df1['总市值'].replace('-', float('nan'))
df1['总市值'] = df1['总市值'].astype(float)
df2 = df1[(df1['总市值'] > 1000000000) & (df1['总市值'] < 30000000000)]
df2['股票名称'] = df2['股票名称'].astype(str)
df2['股票代码'] = df2['股票代码'].astype(str)
df2 = df2[~df2['股票名称'].str.contains('S|\*') & ~df2['股票代码'].str.startswith(('688', '8', '4'))]
  1. 多维度排名与筛选
  2. 营业收入同比增长排名:按照营业收入同比增长指标,选择排名前 30% 的股票中流通市值最小的前 100 只股票,存储在 df3 中。
  3. 净利润同比增长与营业收入同比增长综合排名:计算两个指标的综合排名,选择排名前 30% 的股票中流通市值最小的前 100 只股票,存储在 df4 中。
  4. 净利润同比增长、营业收入同比增长与动态市盈率综合排名:增加动态市盈率指标,计算三个指标的综合排名,选择排名前 30% 的股票中流通市值最小的前 100 只股票,存储在 df5 中。
  5. 合并筛选结果:将 df3, df4, df5 合并,去除重复股票代码,保留唯一股票,按流通市值排序,选取前 100 只股票,存储在 df6 中。
# ... 略去中间代码
df6 = pd.concat([df3, df4, df5])
df6.drop_duplicates(subset='股票代码', keep='first', inplace=True)
df6 = df6.sort_values(by=['流通市值'])
df6 = df6.iloc[:100]
  1. 股票代码格式统一:检查 df6 中股票代码列,确保所有代码均为 6 位数。若长度不足 6 位,则在前面补足 0。
for i, code in enumerate(df6['股票代码']):
if len(str(code)) != 6:
        df6.at[i, '股票代码'] = str(code).zfill(6)
  1. 最终结果存储:将优化后的投资组合数据 df6 存储为新的 CSV 文件('10到300-100.csv'),便于后续分析或分享。
csv_path3 = os.path.join(desktop_path, '10到300-100.csv')
df6.to_csv(csv_path3, index=False, encoding='utf-8-sig')
  1. 查看结果:打印最终投资组合数据的前三行,验证数据筛选与格式化是否正确。
df6 = pd.read_csv(csv_path3, encoding='utf-8-sig')
print(df6.head(3))
  1. 计算运行耗时:使用 time.perf_counter() 记录程序结束时间,计算并输出程序运行总时长(秒)以及格式化为小时:分钟:秒。
b = time.perf_counter()
print('运行时间:%s 秒' % (b - a))
print('运行时间:', time.strftime('%H:%M:%S', time.gmtime(b - a)))

综上所述,这段 Python 代码展示了如何从实时行情数据出发,结合公司财务指标,通过多维度排名与筛选策略,构建出符合特定条件的高质量股票投资组合。整个过程涉及数据获取、清洗、合并、筛选、排名、格式化等多个环节,充分体现了 Python 在金融数据分析领域的高效与灵活性。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何对txt文本中的不规则行进行数据分列
Python股票分析之股票数据采集循环完整代码
全网最详细的爬虫实战教学
[Python策略与安装]基于Python的免费股票数据接口TuShare的使用
Pandas读取数据到Dataframe
Python与财务【上】--数据采集篇
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服