谁是股市的涨跌王?数据分析来解答

数据分析早已成为投资决策的关键工具,而Python,作为一种功能强大的编程语言,为金融分析提供了无限可能。

之前介绍了一些Python中常用的数据分析库,比如pandasnumpy等等,本文将实战演示如何使用这些库来找出股市中涨跌幅度最大的股票。

1. 数据准备

A股的日交易数据来自东方财富的接口,目前已有股票的所有历史交易信息我已经整理成csv文件。

文件的描述和下载请参考:

  1. 2023年日交易数据
  2. 2023年之前的日交易数据

下面的示例选择2023年的数据进行统计分析。

python 复制代码
import pandas as pd
import numpy as np

import matplotlib
import matplotlib.pyplot as plt

# 为了显示中文
matplotlib.rcParams["font.sans-serif"] = ["Microsoft YaHei Mono"]
matplotlib.rcParams["axes.unicode_minus"] = False

# 读取数据
fp = "./data/2023/历史行情数据-东财-前复权-2023.zip"
df = pd.read_csv(fp, compression="zip")

# 将股票代码转成字符串并填充成 6 位
df["股票代码"] = df["股票代码"].apply(lambda x: str(x).zfill(6))

# 排序
df = df.sort_values(["股票代码", "日期"])
df

2. 涨跌天数最多

首先,根据上面数据中的涨跌幅 的正负,确定每天是否涨

python 复制代码
data = df.copy()
data.loc[df["涨跌幅"] >= 0.0, "是否涨"] = 1
data.loc[df["涨跌幅"] < 0.0, "是否涨"] = 0

data = data.loc[:, ["股票代码", "是否涨"]]
data

0和1区分涨跌情况。

然后分组统计每支股票涨的天数,并按照涨的天数从多到少排序。

python 复制代码
data = data.groupby(by="股票代码").sum()
data = data.reset_index()
data = data.sort_values("是否涨", ascending=False)
data

分组统计之后,每行就是一支股票的信息。

然后绘制涨的天数最多前10支股票的柱状图。

python 复制代码
graph_data = data.iloc[:10]
fig = plt.figure(figsize=[8, 6])
plt.bar(
    graph_data["股票代码"],
    height=graph_data["是否涨"],
    color=["b", "c", "g", "m"],
)
plt.xticks(rotation=45)  # 旋转45度
plt.title("涨的天数最多的10支股票")
plt.show()

数据是截止12月初的,横轴的数字是股票代码

跌的天数最多的股票统计方法和上面类似,不再赘述。

3. 连涨/连跌最多

上面是统计总的涨跌天数,比较简单,统计连续涨跌的天数的话,稍微复杂一些。

首先,我们需要封装一个根据是否涨这个标记来计算连续涨跌情况的函数。

python 复制代码
def max_continue_days(s):
    """
    最大连续涨或者跌的天数
    """
    s1 = s.cumsum()
    s = s.mul(s1)
    s = s.diff()
    s = s.where(lambda x: x < 0)
    s = s.ffill()
    s = s.fillna(0)
    s = s.add(s1)
    return s.max()

这个函数的实现参考了:www.bookstack.cn/read/Pandas...

链接的文章中有每个步骤的说明。

有了这个函数,就可以分组统计每支股票的时候计算连涨的天数。

python 复制代码
# 连续涨跌情况
data = df.copy()

# 标记涨跌情况
data.loc[df["涨跌幅"] >= 0.0, "是否涨"] = 1
data.loc[df["涨跌幅"] < 0.0, "是否涨"] = 0

data["是否涨"] = data["是否涨"].astype(int)
data = data.loc[:, ["股票代码", "是否涨"]]
# 用上面的 max_continue_days 函数统计连涨天数
data["连涨天数"] = data.groupby("股票代码")["是否涨"].transform(max_continue_days)
data

进一步统计找出每支股票最大的连涨天数,并按照从大到小排序。

python 复制代码
data = data.groupby("股票代码").max()
data = data.reset_index()
data = data.sort_values("连涨天数", ascending=False)
data

绘制连涨天数最多的前10支股票的柱状图。

python 复制代码
from matplotlib.ticker import MultipleLocator

graph_data = data.iloc[:10]
fig = plt.figure(figsize=[8, 6])
plt.bar(
    graph_data["股票代码"],
    height=graph_data["连涨天数"],
    color=["b", "c", "g", "m"],
)
plt.xticks(rotation=45)  # 旋转45度
plt.gca().yaxis.set_major_locator(MultipleLocator(2))

plt.title("连涨天数最多的10支股票")
plt.show()

今年连涨最多的也就20天。

连跌情况的统计类似,不再赘述。

4. 涨跌幅度最大

这里的示例,我们根据每日的收盘价 来统计每支股票涨跌幅,

也就是根据2023年 每支股票的最低最高收盘价来计算涨跌幅。

python 复制代码
# 统计每支股票收盘价的最低和最高值
data = df.groupby("股票代码")["收盘"].agg(["min", "max"])

# 这里定义 波动 的计算方式
data["波动"] = (data["max"] - data["min"])/data["min"]
data =  data.sort_values("波动", ascending=False)
data =  data.reset_index()
data

绘制柱状图看看波动最大的前10支股票。

python 复制代码
from matplotlib.ticker import FuncFormatter

graph_data = data.iloc[:10]
fig = plt.figure(figsize=[8, 6])
plt.bar(
    graph_data["股票代码"],
    height=graph_data["波动"],
    color=["b", "c", "g", "m"],
)
plt.xticks(rotation=45)  # 旋转45度
plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, y: "{}%".format(x*100)))
plt.title("波动最大的10支股票")
plt.show()

波动最大的股票,最低和最高的收盘价差了20多倍

5. 总结

本文没有任何鼓励炒股的意思,只是为了在真实的数据中演示如何用Python 来统计分析。

这样也许比直接看 pandas 的教程更有目的性一些,pandasAPI非常丰富,只看不用的话很快就忘了。

学习数据分析最好的方法是边学边用,身边的任何数据都可以找个目标去分析看看,不要等学完了再想着去分析。

我在这个网站(databook.top/home)上共享了一些自己收集的数据,都是csv格式(UTF-8编码的),

纯粹为了分析练习之用,有需要随时下载。

之前关于pandas的系列:pandas

相关推荐
Eiceblue1 小时前
Python读取PDF:文本、图片与文档属性
数据库·python·pdf
weixin_527550401 小时前
初级程序员入门指南
javascript·python·算法
程序员的世界你不懂2 小时前
Appium+python自动化(十)- 元素定位
python·appium·自动化
CryptoPP3 小时前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
树叶@3 小时前
Python数据分析7
开发语言·python
老胖闲聊4 小时前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
码界奇点4 小时前
Python Flask文件处理与异常处理实战指南
开发语言·python·自然语言处理·flask·python3.11
浠寒AI4 小时前
智能体模式篇(上)- 深入 ReAct:LangGraph构建能自主思考与行动的 AI
人工智能·python
行云流水剑5 小时前
【学习记录】如何使用 Python 提取 PDF 文件中的内容
python·学习·pdf
心扬6 小时前
python生成器
开发语言·python