用Python分析了7000多个交易日的涨跌数据,看看A股有没有“黑色星期五”

用Python分析了7000多个交易日的涨跌数据,看看A股有没有“黑色星期五”

前言
“黑色星期五”作为一个组合词,可以有很多解释。它起源于西方宗教,耶稣死在星期五,13在西方是不吉利的数字,两者的结合令人相信当天会发生不幸的事情,所以13号与星期五撞到同一天时被称为“黑色星期五”。
“黑色星期五”也用来描述美国商场圣诞促销,美国商场一般用红笔记录亏损,用黑笔记录盈利,人们在感恩节(周四)第二天的这个星期五开始圣诞大采购,商场利润大增,所以这一天被称为“黑色星期五”。
在A股市场中,周五A股停盘之后,欧美股市比A股晚开盘半天,因此星期五可能会有更多资金从A股流出,同时,周六日休市,市场动态不明朗,为了避免不确定性,资金流出的可能性也会增大。因此,股民认为周五股市下跌的可能性会增大,当星期五股市下跌时,股民称之为“黑色星期五”。
A股真的在星期五下跌得更多吗?本文获取了A股成立以来到2022年上半年的涨跌数据,分析究竟星期几下跌得更多,并可视化。
数据获取
本文数据来源于网易财经,可以直接下载,数据获取步骤:
1.进入网易财经首页,在首页A股页面点击<上证指数>。
在这里插入图片描述
2.进入<上证指数>的行情页面,点击<历史交易数据>,进入历史交易页面。
在这里插入图片描述
3.在历史交易页面,找到<下载数据>,点击选择起止日期即可开始下载。A股成立于1990年12月19日,所以默认起始日期就是这一天。
在这里插入图片描述
下载的数据保存在000001.csv中,000001是上证指数的股票代码,本文下载了从1990-12-19至2022-06-30的所有数据。数据无需处理,可以直接使用,也可以直接用办公软件Excel打开。
为了方便代码调用,下载完成后将这个.csv文件拷贝到代码的同级目录下。
在这里插入图片描述
​检查一下,数据共7703条,也就是7703个交易日,共12个字段。
星期几的交易日更多

# coding=utf-8
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('000001.csv', encoding='gbk')
df['涨跌幅'] = df['涨跌幅'].replace('None', '0')
df.fillna('0')
date_of_week = pd.to_datetime(df['日期']).dt.weekday
day_counts = date_of_week.value_counts().sort_index()
# 绘制柱状图
day_name = ['星期一', '星期二', '星期三', '星期四', '星期五']
day_counts.plot.barh(figsize=(8, 4), width=0.6, ylabel='', xlabel='',
                     bottom=0.5, color='y')
plt.xticks(range(0, 2000, 200))
plt.yticks(range(len(day_name)), day_name, fontsize=16)
for a, b in zip(range(len(day_counts)), day_counts):
    plt.text(b+20, a, b, ha='left', va='center', fontsize=16)
plt.show()

在这里插入图片描述
从数据来看,交易日在周一至周五的分布基本是均匀的。法定假日股市都不开市,造成差异的主要原因就是因为法定假日的分布不同。
天数最多的是星期三1555天,最少的是星期一1516天,相差2.5%左右。
星期几下跌的天数更多

df = pd.read_csv('000001.csv', encoding='gbk')
df['涨跌幅'] = df['涨跌幅'].replace('None', '0')
df.fillna('0')
# 筛选出下跌的数据
df_down = df[df['涨跌幅'].astype('float') < 0]
# 取出下跌的日期
date_down = pd.to_datetime(df_down['日期'])
# 将日期转换成周的第几天,0:周一,4:周五
date_down_of_week = date_down.dt.weekday
# 统计每一天的频数
down_day_counts = date_down_of_week.value_counts().sort_index()
# 绘制柱状图
day_name = ['星期一', '星期二', '星期三', '星期四', '星期五']
down_day_counts.plot.barh(figsize=(8, 4), width=0.6, ylabel='', xlabel='',
                     bottom=0.5, color='gray')
plt.xticks(range(0, 1000, 100))
plt.yticks(range(len(day_name)), day_name, fontsize=16)
for a, b in zip(range(len(down_day_counts)), down_day_counts):
    plt.text(b+20, a, b, ha='left', va='center', fontsize=16)
plt.show()

在这里插入图片描述
筛选出下跌的交易日,可以看出周四下跌的天数最多。在周四下跌的天数是812天,比周五下跌的天数701天多出了111天,说明周四比周五更“黑色”。
星期几下跌的概率更高

# 计算跌的比例
df_pre = pd.DataFrame({'down': down_day_counts/day_counts,
                       'other': (day_counts-down_day_counts)/day_counts})
# 绘制堆叠柱状图
day_name = ['星期一', '星期二', '星期三', '星期四', '星期五']
df_pre.plot(kind='barh', figsize=(8, 4), color=['#07A168', '#EE5F5B'], stacked=True, legend=None)
plt.yticks(range(len(day_name)), day_name, fontsize=16)
for a, b in zip(range(len(down_day_counts)), down_day_counts/day_counts):
    plt.text(b-0.01, a, '%.02f%%' % (b*100), ha='right', va='center', fontsize=16)
plt.show()

在这里插入图片描述
从下跌的比例看,只有星期四的比例超过了50%,星期五的下跌比例低于星期三和星期四,只比星期一星期二略高。
可视化星期几更“黑色”

from PIL import Image, ImageDraw, ImageFont

data = {
    # 根据比例换算颜色的梯度
    'px': [255-x*255//max(down_day_counts) for x in down_day_counts],
    'text': ['星\n\n期\n\n一', '星\n\n期\n\n二', '星\n\n期\n\n三', '星\n\n期\n\n四', '星\n\n期\n\n五'],
    'loc': [x for x in range(0, 1000, 200)]
}
# 创建一张底图
im = Image.new('RGB', (1000, 500), color=(255, 255, 255))
font = ImageFont.truetype(r'C:\Windows\Fonts\simhei.ttf', 60)
# 将周一至周五的图片依次粘贴到底图上
for i in range(5):
    new_img = Image.new('RGB', (200, 500), (data['px'][i], data['px'][i], data['px'][i]))
    draw = ImageDraw.Draw(new_img)
    draw.text((70, 100), data['text'][i], font=font, fill=(7, 161, 104))
    im.paste(new_img, (data['loc'][i], 0))
im.show()

在这里插入图片描述
根据星期几的下跌天数,按比例换算成不同的RGB颜色值,放到同一张图片中。下跌天数最多的星期四最黑,其次是星期三,星期五介于中间,最浅的是星期一和星期二(一样多)。
原理介绍:
这段代码用到上面绘制直方图时计算的天数,用天数等比例换算成RGB(红、绿、蓝三原色)的颜色值,RGB颜色(0, 0, 0)表示黑色,(255, 255, 255)表示白色,在0~255之间,当三个值相等时,可以得到不同深浅的灰色。
A股涨跌天数对比

df = pd.read_csv('000001.csv', encoding='gbk')
df['涨跌幅'] = df['涨跌幅'].replace('None', '0')
df_up = df[df['涨跌幅'].astype('float') > 0]
df_keep = df[df['涨跌幅'].astype('float') == 0]
df_down = df[df['涨跌幅'].astype('float') < 0]
im = Image.new('RGB', (len(df)//10, 50), color=(0, 0, 0))
font = ImageFont.truetype(r'C:\Windows\Fonts\simhei.ttf', 20)
width = [len(df_up)//10, 1, len(df_down)//10]
color = [(238, 95, 91), (100, 100, 100), (7, 161, 104)]
text = ['涨{}天'.format(len(df_up)), '平{}天'.format(len(df_keep)), '跌{}天'.format(len(df_down))]
loc = [0, len(df_up)//10, len(df_up)//10+1]
for i in range(3):
    new_img = Image.new('RGB', (width[i], 50), color=color[i])
    draw = ImageDraw.Draw(new_img)
    draw.text(((width[i]-80)//2, 15), text[i], font=font, fill=(0, 0, 0))
    im.paste(new_img, (loc[i], 0))
im.show()

在这里插入图片描述
用相同的方法,对比A股历史交易日的涨跌天数,A股涨的天数比跌的天数多426天,只算交易日差不多相当于两年。
A股成立以来,只有5天是不涨不跌的,所以在图形中只有一条看不出来的缝。
总结
1.当星期五股票下跌时,就有股民称之为“黑色星期五”,这是用来形容单独的某一天。而本文是根据历史数据,统计和对比星期几跌的天数更多,结论是星期四和星期三跌的天数都比星期五多,从这个角度分析星期四最“黑色”。
2.本文只分析了跌的天数,而没有计算跌的幅度,因为本文关注的重点是天数,如果算上跌幅,结果可能会有所不同。
3.本文获取的数据中包含了“涨跌幅”、“涨跌额”等,你可以继续往深处挖掘,说不定会发现一些有趣的结论,可以充分发挥你的想象力,感受数据挖掘的魅力。我以后也可能还会再写相关的内容,如果想一步到位获取本文的完整代码和数据,可以关注下方公众号,在后台回复“000001”获取。
4.本文的分析角度较主观,仅作为个人分享,不构成投资建议。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小斌哥ge

非常感谢,祝你一切顺利。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值