Python数据分析案例31——中国A股的月份效应研究(方差分析,虚拟变量回归)

案例背景

本次案例是博主本科在行为金融学课程上做的一个小项目,最近看很多经管类的学生作业都很需要,我就用python来重新做了一遍。不弄那些复杂的机器学习模型了,经管类同学就用简单的统计学方法来做模型就好。


研究目的

有效市场假说是现代金融证券市场的理论基础之一,根据这一理论,投资者买卖股票市场是很难通过主动管理去获得超额收益,而且平均时间段的收益应该也没有显著性的差异。​

但在我国市场明显存在着一个春节效应,即股市二月份的收益率一般远要高于一年中其他月份的收益率。而且中国股市还有一句老话,叫做五穷六绝七翻身,意思是五月六月的收益率低,而七月的收益率就有所上升。国外学者研究中,一些成熟的股票市场也会出现着这样一种季节性的或是周末性的效应​。这种违背了有效市场假说的现象,一般应该与人的心理会有联系,研究范围属于行为金融学范围。

本文以上证综合指数为例,选取收盘价作为样本数据,对其进行实证分析研究,检验中国股市是否呈现在了月份效应,根据这一分析,可以对股票投资策略上提出一定的建议​。


数据

既然研究中国股市,那就用最有代表性的A股上证指数吧,十多年了还是3000点不保.....

使用akshare的api接口进行获取数据,当然本项目的全部代码和数据文件还是可以这样获取,需要的同学可以看看:数据


代码实现

导入包:

import akshare as ak
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns %matplotlib inline
plt.rcParams['font.sans-serif'] = ['KaiTi']  #中文
plt.rcParams['axes.unicode_minus'] = False   #负号

数据获取 

然后获取上证指数的数据 

# 获取上证指数的日K线数据
df_300= ak.stock_zh_index_daily(symbol="sh000001")
df_300 

##储存

df_300.to_excel('data.xlsx',index=False)

换成别的数据文件都可以,别的股票或者指数....


 数据转化

要换成自己的数据文件就再读取一遍就好了,命名为df_300,后面一样用。

既然研究月份,那么得需要先计算每个月的收益率,转化日K为月份

# 转换日期格式并设置为索引
df_300['date'] = pd.to_datetime(df_300['date'])
df_300.set_index('date', inplace=True)
df=df_300.resample('M').ffill()

 使用每个月的收盘价

df['monthly_return']=df['close'].pct_change().fillna((0))
df

最后一列就是每个月的收益率了,但是这样一条数据不直观,这样看比较好:
 

data=pd.DataFrame()
data['monthly_return']=df['monthly_return']
data['year'] = df.index.year
data['month'] = df.index.month
data = data.pivot_table(index='year', columns='month', values='monthly_return').iloc[1:-1,:]
data

这样就可以清楚地看见每年每个月的收益率了。

描述性统计

描述性统计也很方便:

data.describe()

 

每个月的收益率和均值方差,一目了然。

简单做个t检验,来看看哪几个月的收益率存在显著性差异

import scipy.stats as stats
for i in range(len(data.columns)):for j in range(i + 1, len(data.columns)):t_statistic, p_value = stats.ttest_ind(data[data.columns[i]], data[data.columns[j]])if p_value < 0.05:print(f"0.05的显著性水平下,{data.columns[i]}月和{data.columns[j]}月有显著性差异")

画出每个月的箱线图:

#查看特征变量的箱线图分布
columns = data.columns.tolist() # 列表头
dis_cols = 4                   #一行几个
dis_rows = len(columns)
plt.figure(figsize=(4 * dis_cols, 4 * dis_rows))for i in range(len(columns)):plt.subplot(dis_rows,dis_cols,i+1)sns.boxplot(data=data[columns[i]].to_numpy(), orient="v",width=0.5)plt.xlabel(columns[i],fontsize = 20)
plt.tight_layout()
plt.show()

这样看不直观,数据变一下画小提琴图:
 

df['month']=df.index.month
df1=df[['month','monthly_return']]

画图 

fig = plt.figure(figsize=(14, 6), dpi=256)  # 指定绘图对象宽度和高度
ax = sns.violinplot(x='month',y='monthly_return',width=0.8,saturation=0.9,lw=0.8,palette="Set2",orient="v",inner="box",data=df1)
#plt.xlabel((['月份' + str(i+1) for i in range(13)]),fontsize=10)
plt.ylabel('monthly_return', fontsize=16)
plt.show()

可以看到基本上每个月的收益率均值都是0附近,5月和8月的方差较大,这和历史上的某些“股灾”“金融风暴”有关。


方差分析

我们要研究的是不同月份之间的股市收益率差异,就是分类型自变量是否对数值型因变量有显著性影响,那么就是方差分析的范围了。

原假设:不同月份之间的股市收益率相同。

备择假设:不同月份之间的股市收益率存在显著性不同。

先导入包:
 

import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.multicomp import pairwise_tukeyhsd

进行方差分析:

df1['month']= df1['month'].astype('category')
model = ols('monthly_return ~ month', data=df1).fit()
anova_results = sm.stats.anova_lm(model, typ=1)
anova_results

 

我们可以看到F值只有0.61,p值为0.8,远远不显著,说明每个月的收益率没有显著性差异。

接受原假设,即不能说明每个月的收益有显著性差异。

得到这个结果我是很惊讶的,因为我本科做的是显著的呀,奇怪,从2019年到2023年就变得不显著了???

我不死心,用虚拟变量回归的方法再试了一次。


虚拟变量回归

虚拟变量就是0和1这种哑变量,计算机里面又叫独立热编码,如果我们想表示12个月份,那么就生成一个12维的X,表示1月就第一个x为1,其他为0,表示2月就第二个x为1,其他为0.....以此类推。然后用这些X去和收益率y进行回归。
注意,在实际操作中只能生成k-1个变量,不然会陷入“虚拟变量陷阱”,即形成完美的多重共线性。

所以我删除了一月,用一月作为基准月份:

# 创建月份虚拟变量
df1 = pd.get_dummies(df1, columns=['month'], prefix='month', drop_first=True)# 构建线性回归模型,一月作为基准月份被省略
formula = 'monthly_return ~ ' + ' + '.join([col for col in df1.columns if col.startswith('month_')])
model = ols(formula, data=df1).fit()# 输出模型结果
model_summary = model.summary()
model_summary

只看F值,好吧还是不显著,F值对应的p有0.8,远远不显著 。再看每个虚拟变量的t值,也没有一个显著。。。丫的,我不甘心,但是这就是现实。。我也没办法变得显著了。


之后我还尝试使用沪深300指数,我发现也是不显著。这说明,不同月份之间的A股收益率确实不存在显著性差异,那些幻想说2月份春节收益率高的,不存在....可能是某写个别的年份2月收益率高(例如2019),但是整体来看,A股30多年,不存在那些月份会有离谱的收益率。。。

虽然不显著,但是这个研究还是有意义的,起码说明了A股股市在月份效应上真的没啥规律。


 当然,这案例换一下数据,换一个效应都还是很好模仿的。例如可以用个股的数据,或者某个行业的数据,研究节假日效应,季节效应,等等,都是虚拟变量,都是方差分析可以做的。


创作不易,看官觉得写得还不错的话点个关注和赞吧,本人会持续更新python数据分析领域的代码文章~(需要定制代码可私信)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE项目快速打包发布

VUE项目快速打包发布 首先在你的VS Code中新建一个终端 输入 npm run build 回车等运行结束之后会在你的项目中生成一个dist目录 此时再iis部署的时候把你添加的网站指定的目录指向dist即可

STM32CubeMX配置STM32G071UART+DMA收发数据(HAL库开发)

时钟配置HSI主频配置64M 配置好串口&#xff0c;选择异步模式 配置DMA TX,RX,选择循环模式。 NVIC中勾选使能中断 勾选生成独立的.c和h文件 配置好需要的开发环境并获取代码 串口重定向勾选Use Micro LIB main.c文件修改 增加头文件和串口重定向 #include <string.h&g…

spring常见漏洞(3)

CVE-2017-8046 Spring-Data-REST-RCE(CVE-2017-8046)&#xff0c;Spring Data REST对PATCH方法处理不当&#xff0c;导致攻击者能够利用JSON数据造成RCE。本质还是因为spring的SPEL解析导致的RCE 影响版本 Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3 Spring Bo…

光学雨量监测站比传统雨量站有哪些优势

光学雨量监测站相比传统雨量站具有许多优势。首先&#xff0c;光学雨量监测站采用光学原理进行雨量监测&#xff0c;而传统雨量站则依靠传感器和机械部件进行测量。光学雨量监测站的结构相对简单&#xff0c;不需要频繁维护和校准&#xff0c;减少了运维成本和工作量。 其次&am…

【Emgu CV教程】5.1、几何变换之平移

图像的几何变换对于图像处理来说&#xff0c;也是最基础的那一档次&#xff0c;包括平移、旋转、缩放、透视变换等等&#xff0c;也就是对图像整理形状的改变&#xff0c;用到的函数都比较简单&#xff0c;理解起来也很容易。但是为了凑字数&#xff0c;还是一个函数一个函数的…

如何通过企业司法协助信息API识别潜在的不良合作伙伴

引言 在商业合作中&#xff0c;合作伙伴的信誉和合规性是至关重要的。然而&#xff0c;在选择合作伙伴时&#xff0c;我们往往面临信息不对称的问题。如何有效地识别潜在的不良合作伙伴&#xff0c;避免潜在的风险呢&#xff1f;通过企业司法协助信息API&#xff0c;我们可以快…

mysql简单操作集成数据模型使用方法

查看表信息&#xff0c;其中包括字段信息以及创表信息 DESCRIBE asset; show COLUMNS FROM asset; SHOW CREATE TABLE asset; 常规操作表 --查询 select * FROM device_template --插入 INSERT into asset_package (protocol,project_code,lease_id,station_name,device_id,…

Qt点击按钮在附近弹出下拉框

效果 MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include"toollayout.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow…

vue3+vite项目构建时报错npm ERR! code EPERMnpm ERR! syscall mkdir...

vscode终端中输入npm create vitelatest vueviteproject1 -- --vue命令后报错 具体报错如下&#xff1a; PS D:\project> npm create vitelatest vueviteproject1 -- --vue >> npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! path D:\node\node_cache\_cac…

C语言:自定义类型——联合和枚举

一、联合体 1.1 联合体类型的声明 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以是不同的类型。 声明方式如下图&#xff1a; 那联合体和结构体究竟有什么区别呢&#xff1f;&#xff1f; 下面将重点讲解联合体的特点&#xff01;&am…

判断交叉编译工具是否支持C++20的标准

写个任意的测试程序hello_world 执行 arm-linux-gnueabihf-g -stdc14 main.cpp arm-linux-gnueabihf-g -stdc17 main.cpp arm-linux-gnueabihf-g -stdc20 main.cpp没报错则代表支持&#xff0c;报错则不支持.

数字图像处理常用算法的原理和代码实现详解

本专栏详细地分析了常用图像处理算法的数学原理、实现步骤。配有matlab或C实现代码&#xff0c;并对代码进行了详细的注释。最后&#xff0c;对算法的效果进行了测试。相信通过这个专栏&#xff0c;你可以对这些算法的原理及实现有深入的理解&#xff01;   如有疑问&#xf…

公司想做一套数字化管理系统,该怎么做?

引言 一个老板的心声&#xff1a;随着科技的迅猛发展&#xff0c;公司数字化已经成为提升业务竞争力不可或缺的关键因素。在这个数字时代&#xff0c;我们公司旨在顺应潮流&#xff0c;迎接挑战&#xff0c;以构建一套强大而高效的数字化管理系统为目标。通过本系统&#xff0…

8路DI高速计数器,8路DO支持PWM输出,Modbus TCP模块 YL93 开关量输入输出

特点&#xff1a; ● 8路开关量输入&#xff0c;8路开关量输出 ● DI每一路都可用作计数器或者频率测量 ● DO每一路都可独立输出PWM信号 ● DI和DO都支持PNP&#xff0c;NPN切换功能 ● 支持Modbus TCP 通讯协议 ● 内置网页功能&#xff0c;可以通过网页查询电平状…

安达发|APS计划排产排程排单软件功能解析

APS计划排产排程排单软件是一种用于生产计划和排程的工具&#xff0c;它可以帮助制造企业实现高效、准确的生产计划和排程。该软件具有多种功能&#xff0c;包括可视化人机互动排产、一键式全自动排产、设备产能约束排产、模具约束排产、人员约束排产、半成品约束排产、物料齐套…

Unity | 渡鸦避难所-7 | 攻击碰撞检测

1 前言 英雄的宝剑并非只是装饰物&#xff0c;利剑出鞘时可以对怪物造成伤害。同样&#xff0c;怪物挥出铁拳时也会对英雄造成伤害。当然&#xff0c;都有同样的前提&#xff1a;在武器碰到对方的情况下&#xff0c;才会造成伤害。利用物理引擎&#xff0c;可以轻松的实现碰撞…

SparkSQL——(扩展) Cataylst

(扩展) Cataylst 优化器 RDD 和 SparkSQL 运行时的区别 RDD 的运行流程 大致运行步骤&#xff1a; 先将 RDD 解析为由 Stage 组成的 DAG, 后将 Stage 转为 Task 直接运行 问题&#xff1a; 任务会按照代码所示运行, 依赖开发者的优化, 开发者的会在很大程度上影响运行效率 解决…

图像分类 | 基于 Labelme 数据集和 VGG16 预训练模型实现迁移学习

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要使用数据标注工具 Labelme 对自行车&#xff08;bike&#xff09;和摩托车&#xff08;motorcycle&#xff09;这两种训练样本进行标注&#xff0c;使用预训练模型 VGG16 作为卷积基&#xff0c;并在其之上添加了全连接…

【OpenCV学习笔记14】- 图像的几何变换

这是对于 OpenCV 官方文档中 图像处理 的学习笔记。学习笔记中会记录官方给出的例子&#xff0c;也会给出自己根据官方的例子完成的更改代码&#xff0c;同样彩蛋的实现也会结合多个知识点一起实现一些小功能&#xff0c;来帮助我们对学会的知识点进行结合应用。 如果有喜欢我笔…

Notepad++运行C语言输出乱码

方法一&#xff1a;编码-编码字符集-中文-GB2312 这时原程序中文会变成乱码&#xff0c;我是重新输入中文 重新编译执行即可 缺陷&#xff1a;重开一个程序有中文还是会显示乱码&#xff0c;需要重新设置编码&#xff0c;比较麻烦 方法二&#xff1a;设置-首选项-新建-右侧编…