likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 5

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

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

1. 数据准备

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

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

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

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. 涨跌天数最多

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

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

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

谁是股市的涨跌王?数据分析来解答0和1区分涨跌情况。

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

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

谁是股市的涨跌王?数据分析来解答分组统计之后,每行就是一支股票的信息。然后绘制涨的天数最多前10支股票的柱状图。

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. 连涨/连跌最多

上面是统计总的涨跌天数,比较简单,统计连续涨跌的天数的话,稍微复杂一些。首先,我们需要封装一个根据是否涨这个标记来计算连续涨跌情况的函数。

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…链接的文章中有每个步骤的说明。

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

# 连续涨跌情况
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

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

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

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

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

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

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年每支股票的最低最高收盘价来计算涨跌幅。

# 统计每支股票收盘价的最低和最高值
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支股票。

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编码的),纯粹为了分析练习之用,有需要随时下载。

转载自:https://juejin.cn/post/7314365534107090982
评论
请登录