本次项目以2020年平安银行的股票信息来进行数据分析
开发工具:jupyter notebook
首先导入本次项目用到的包
import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import warnings warnings.filterwarnings('ignore') # 忽略警告 plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示 plt.rcParams['axes.unicode_minus'] = False #解决符号无法显示
导入原始数据
data = pd.read_csv('2020_pinganbank_hist_dat (1).csv') # 导入原始数据 data.head()
1) 数据只保留日期(date)、开盘价(open)、收盘价(close)、成交量(volume)、涨跌幅(p_change)和换手率(turnover)这几个属性,并按时间先后顺序对数据进行排序。
data = data[['date','open','close','volume','p_change','turnover']] # 导入数据,只保留日期(date)、开盘价(open)、收盘价(close)、成交量(volume)、涨跌幅(p_change)和换手率(turnover)这几个属性 data.sort_values(by='date',inplace=True) # 按时间先后顺序对数据进行排序 data.head() # 展示数据前五行
2.绘制出开盘价(open)和收盘价(close)的走势折线图,注意 X 轴绘制字符重叠问题的处理;
plt.figure(figsize=(15,8)) # 画布大小 plt.plot(data['date'],data['open'],label='开盘价') # 开盘价折线图 plt.plot(data['date'],data['close'],label='收盘价') # 收盘价折线图 ax = plt.gca() # 处理x轴字符重叠问题 data_format = mpl.dates.DateFormatter('%m-%d') # 处理x轴字符重叠问题 ax.xaxis.set_major_formatter(data_format) # 处理x轴字符重叠问题 xlocator = mpl.ticker.MultipleLocator(7) # 处理x轴字符重叠问题 ax.xaxis.set_major_locator(xlocator) # 处理x轴字符重叠问题 plt.xticks(rotation=45) # 将x轴标签旋转45° plt.legend(loc='upper center') # 添加图例 plt.show()
3.输出这一年内成交量(volume)最低和最高那两天的日期和分别的成交量以及收盘价(close)和换手率(turnover);
heigher = data['volume'].sort_values().index[-1] # 成交量最高那天的数据 lower = data['volume'].sort_values().index[0] # 成交量最低那天的数据 data[(data.index == lower) | (data.index == heigher)][['date','volume','close','turnover']] # 成交量(volume)最低和最高那两天的日期和分别的成交量以及收盘价(close)和换手率(turnover)
4.以成交量(volume)为 X 轴,收盘价(close)为 Y 轴,绘制出散点图,分析收盘价和成交量之间是否存在关联
plt.figure(figsize=(15,8)) # 画布大小 plt.scatter(x=data['volume'],y=data['close']) # 画散点图 plt.xlabel('成交量',fontsize=15) # x轴标签 plt.ylabel('收盘价',fontsize=15) # y轴标签 plt.title('成交量与收盘价的关系',fontsize=15) # 图的标题 plt.show() # 从图看出没有相关关系
5.列出成交量(volume)在 1100000 以上且换手率(turnover)在 0.5 以上的记录,分析成交量和换手率之间是否存在关联
data1 = data[(data['volume'] > 1100000) & (data['turnover'] > 0.5)] # 成交量(volume)在 1100000 以上且换手率(turnover)在 0.5 以上的记录 data1
plt.figure(figsize=(15,8)) # 画布大小 plt.scatter(x=data1['volume'],y=data1['turnover']) # 画散点图 plt.xlabel('成交量',fontsize=15) # x轴标签 plt.ylabel('换手率',fontsize=15) # y轴标签 plt.title('成交量与换手率的关系',fontsize=15) # 图的标题 plt.show() # 从图中看出具有较强的正相关性
6. 统计这一年中收盘价(close)高于开盘价(open)的天数,占今年总交易日的比率,如果每天以收盘价购买 1000 股,第二天以开盘价卖出 1000股,一年的收益是多少;
heigher_day = data[data['close'] > data['open']]['date'].count() # 计算收盘价高于开盘价的天数 sum_day = data['date'].count() # 计算总交易日 rate = heigher_day/sum_day # 计算比率 rate # 比率
0.4959016393442623
open_ = data['open'][1:]*1000 # 开盘价(从第一天开始到最后一天,但不包含第一天) close_ = data['close'][:-1]*1000 # 收盘价(从第一天到最后一天,但不包含最后一天) sum_profit = open_.sum() - close_.sum() # 计算最后总收益 sum_profit # 最后总收益
-2010.0
7.按周统计出每周的累计涨跌幅,并绘制出条形图;
data['date'] = pd.to_datetime(data['date']) # 将date转化为日期类型 plt.figure(figsize=(18,10)) # 设置画布大小 data.resample('W',on='date')['p_change'].sum().plot(kind='barh',title='每周的累计涨跌幅') # 按周统计出每周的累计涨跌幅,并绘制出条形图
8.计算出每月开盘价(open)和收盘价(close)的平均值,并绘制出柱状图
# 计算出每月开盘价(open)和收盘价(close)的平均值,并绘制出柱状图 data.resample('M',on='date')[['open','close']].mean().plot(kind='bar',title='每月开盘价和收盘价的平均值')