一、选题的背景

股票市场一直是金融领域的焦点之一,对股票数据进行大数据分析有助于了解市场趋势、预测价格波动、优化投资策略等。随着大数据技术的快速发展和 应用,越来越多的投资者、交易员和分析师开始利用大数据技术来解读和分析股票市场数据。通过对股票数据的大数据分析可以提供有关市场走势、投资机会和风险的深入洞察,帮助投资者和交易员做出明智的决策,并提高投资和交易的效果。结合Python强大的数据分析和可视化工具,可以提供全面、准确的市场洞察和投资决策支持,为投资者和交易员带来更好的交易体验和投资回报。

二、大数据分析设计方案

下载老师提供的数据集,导入并理解数据集,观察数据集属性,经过数据清洗得到全新的数据集用于数据分析与可视化,用数据可视化分析股票股价趋势,股价的分布和股票之间的联系与对比。

三、数据分析步骤

1.导入库

import pandas as pd

import matplotlib.pylab as plt

2.导入数据集并显示数据

1 #读取数据

2 import pandas as pd

3 data = pd.read_csv('D:\python\股票数据集.csv')

4 #显示数据

5 data

3.数据处理:查看是否含有缺失值,如果有删除缺失值并检查是否删除

1 #查看缺失值

2 data.isnull().sum()

其中open,high,low列含有空值

1 #删除缺失值

2 data.dropna(inplace=True)

3 #查看是否删除

4 data.isnull().sum()

可以看出空值已删除

4.查看数据类型

1 #查看数据基本信息和数据类型。

2 data.info()

data为日期

Open为开盘价,

High为当天最高价,

Low为最低价,

Close为当天收盘价,

Volume指当天总共的股票交易数。

5.重命名列并基于日期列创建两个新列“mouth”和“day”便于可视化

1 import pandas as pd

2 data = pd.read_csv('D:\python\股票数据集.csv')

3

4 # 重命名列

5 data.columns = ['date', 'open', 'high', 'low',

6 'close', 'volume', 'stock_name']

7

8 data['date']=pd.to_datetime(data['date'])

9 data = data.assign(month=data['date'].dt.month)

10 data = data.assign(day=data['date'].dt.day)

11 data

6.单只股票价格折线图:股价在时间轴上的对比(以2017年为例)

1 # 设置坐标周和图表大小。

2 fig, ax = plt.subplots(figsize = (8,6))

3

4 # 股票名称列表

5 lst_stocks = ['AAL']

6

7 for s in lst_stocks:

8 # 绘制每个股票收盘价格折线图

9 data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \

10 .loc[:, ['date', 'close']] \

11 .set_index('date') \

12 .plot(kind = 'line',

13 ax = ax)

14 # 更新图示为对应股票名

15 ax.legend(lst_stocks, loc = 5)

16 plt.title('2017年股票收盘价趋势图')

17 plt.yticks(fontsize=14)

18 plt.ylim(0,100)

19 plt.show()

从图中得到信息:AAL股价在2017年趋势较为平稳,上下波动幅度不大

7.多只股票价格折线图:多只股票股价在时间轴上的对比

查看股票数据集中含有的数据种类

1 import pandas as pd

2 # 读取数据集

3 data = pd.read_csv('D:\python\股票数据集.csv')

4 # 统计某列不同数据的名称并输出

5 names = data['Name'].unique()

6 print(names)

选取部分股票进行对比

1 # 设置坐标周和图表大小。

2 fig, ax = plt.subplots(figsize = (8,6))

3 #股票名称列表

4 lst_stocks = ['AAL','ABBV','ZION','ZTS','AAPL','AAP']

5 for s in lst_stocks:

6 # 绘制每个股票收盘价格折线图

7 data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \

8 .loc[:, ['date', 'close']] \

9 .set_index('date') \

10 .plot(kind = 'line',

11 ax = ax)

12 # 更新图示为对应股票名

13 ax.legend(lst_stocks, loc = 5)

14 plt.title('2017年股票收盘价趋势图')

15 plt.yticks(fontsize=14)

16 plt.ylim(0,200)

17 plt.show()

多个股票价格趋势图画在同一张图上,我们的关注点是不同股票之间的对比。从上图我们可以得到一些简单的结论:AAP与AAPL股价波动较为明显,AAP呈现下降趋势,AAPL呈现上升趋势。其它股票相对于AAP,AAPL较低,趋势比较平稳。

8.股价均线图:一只股票这一年的股价趋势和它的均线。(以AAPL为例)

利用pandas生成30, 60, 90天的移动平均值。再在收盘价趋势图上画出这3条移动平均线。

1 # 计算移动平均值。

2 df_abbv = data[data['stock_name'] == 'AAPL'].copy()

3 df_abbv['thirty_ma'] = df_abbv.close.rolling(window = 30).mean()

4 df_abbv['sisty_ma'] = df_abbv.close.rolling(window = 60).mean()

5 df_abbv['ninety_ma'] = df_abbv.close.rolling(window = 90).mean()

6

7 # 生成坐标轴并定义图表大小。

8 fig, ax = plt.subplots(figsize = (8,6))

9

10 # 使用循环生成4条折线

11 lst_col = ['close', 'thirty_ma', 'sisty_ma', 'ninety_ma']

12 for c in lst_col:

13 df_abbv[df_abbv['date'].dt.year == 2017] \

14 .loc[:, ['date', c]] \

15 .set_index('date') \

16 .plot(kind = 'line',

17 ax = ax,

18 title = '2017 AAPL股价趋势图')

19

20 # 更新标签

21 lst_led = ['日收盘价', '30日线', '60日线', '90日线']

22 ax.legend(lst_led)

23 plt.show()

从上图就可以非常直观看到多条均线的走势。AAPL在6月前都在上升通道中,股价稳定上涨。但是在7月到11月之间从3条均线都可以看到有下降趋势。

9.不同股票收盘价箱线图:多只股票价格分布,对比波动性。

由于不同股票的价格区间不同,想要比较他们的价格波动性,折线图显然不是最好的选择。而使用箱线图就能很好地展现数据的分布情况。

1 data = data.loc[data['stock_name'].isin(['AAL', 'ABBV','ZION','ZTS','AAPL','AAP'])]

2 # 使用boxplot画出箱线图

3 data \

4 .loc[:, ['stock_name','close']] \

5 .boxplot(by = 'stock_name',

6 figsize = (8,6)) \

7 .set(xlabel=None)

8 plt.suptitle('')

9 plt.title('2017年收盘价箱图')

10 plt.show()

从箱线图中可以看到:AAP和AAPL股价波动最为明显,AAL和ZION的股价相对稳定。

10.AAP月箱线图:一只股票股价趋势,同时对比段时间股价波动性。

只用pandas和matplotlib不能画出专业的k线图,所以我们用箱线图仿月k线图来展示股价趋势和成交价格最大值和最小值。这里除了趋势之外,我们还能看到一段时间内数据的分布,使用箱线图就可以很好地展示这些数据特征。

1 # 使用boxplot可以画出简单k线图

2 df_amzn = data[data['stock_name'] == 'AAP'].copy()

3 df_amzn \

4 .loc[:, ['month','close']] \

5 .boxplot(by = 'month',

6 figsize = (8,6)) \

7 .set(xlabel=None)

8 plt.suptitle('')

9 plt.title('AAP2017年月k图')

10 plt.show()

11.AAP月平均成交量柱状图:单只股票对比其不同月份的月均交易量。

1 # 使用boxplot可以画出简单k线图

2 df_amzn \

3 .groupby('month')['volume'] \

4 .mean() \

5 .plot(kind = 'bar')

6 plt.title('AAP2017年月均交易量图')

7 plt.show()

箱图和柱状图在同一画布:使得报告更紧凑,或者方便从不同维度解释数据

1 # 设置画布

2 fig, ax = plt.subplots(1,2, figsize = (9,4))

3

4 df_amzn \

5 .loc[:, ['month','close']] \

6 .boxplot(by = 'month',

7 figsize = (8,6),

8 ax = ax[0]) \

9 .set(xlabel=None, title = 'AAP2017年月k图')

10 plt.suptitle('')

11 df_amzn \

12 .groupby('month')['volume'] \

13 .mean() \

14 .plot(kind = 'bar',

15 ax = ax[1],

16 title = 'AAP2017年月均交易量图')

17 plt.show()

12.AAP收盘价与成交量散点图:单只股票收盘价和成交量的关系。

1 # 散点图

2 df_amzn \

3 .loc[:, ['close', 'volume']] \

4 .plot(x = 'close', y = 'volume',

5 kind = 'scatter',

6 figsize = (8,6),

7 color = 'green',

8 title = 'AAP收盘价与成交量散点图')

9 plt.show()

10 print('AAP收盘价与成交量相关矩阵')

11 df_amzn.loc[:, ['close', 'volume']].corr()

从相关矩阵上看,收盘价与成交量相关性为0.06,两个变量之间存在一定的线性关系,但这种关系比较弱。

从散点图上看,成交量在不同价格区间内较为集中。

附完整程序源代码

1 import pandas as pd

2 import matplotlib.pylab as plt

3 #读取数据

4 import pandas as pd

5 data = pd.read_csv('D:\python\股票数据集.csv')

6 #显示数据

7 data

8 #查看缺失值

9 data.isnull().sum()

10 #删除缺失值

11 data.dropna(inplace=True)

12 #查看是否删除

13 data.isnull().sum()

14

15 import pandas as pd

16 data = pd.read_csv('D:\python\股票数据集.csv')

17

18 # 重命名列

19 data.columns = ['date', 'open', 'high', 'low',

20 'close', 'volume', 'stock_name']

21

22 data['date']=pd.to_datetime(data['date'])

23 data = data.assign(month=data['date'].dt.month)

24 data = data.assign(day=data['date'].dt.day)

25 data

26

27 import matplotlib.pylab as plt

28 # 设置坐标周和图表大小。

29 fig, ax = plt.subplots(figsize = (8,6))

30

31 # 将以下列表替换为您想要绘制的股票名称列表

32 lst_stocks = ['AAL']

33

34 for s in lst_stocks:

35 # 绘制每个股票收盘价格折线图

36 data[data['stock_name'] == s] \

37 .loc[:, ['date', 'close']] \

38 .set_index('date') \

39 .plot(kind = 'line',

40 ax = ax)

41 # 更新图示为对应股票名

42 ax.legend(lst_stocks, loc = 5)

43 plt.title('股票收盘价趋势图')

44 plt.yticks(fontsize=20)

45 plt.show()

46

47 import matplotlib.pyplot as plt

48 import pandas as pd

49

50 # 读取股票数据

51 data = pd.read_csv('D:\python\股票数据集.csv')

52

53 # 选择某一只股票的数据

54 #data = data[data['stock_name'] == 'ZTS']

55

56 # 绘制折线图

57 plt.plot(data['date'], data['close'])

58

59 # 选择2018年的数据

60 data = data[(data['date'] >= '2018-01-01') & (data['date'] <= '2018-12-31')]

61

62

63 # 设置标题和轴标签

64 plt.title('Stock Price')

65 plt.xlabel('Date')

66 plt.ylabel('close')

67

68 # 显示图表

69 plt.show()

70

71 # 设置坐标周和图表大小。

72 fig, ax = plt.subplots(figsize = (8,6))

73

74 # 股票名称列表

75 lst_stocks = ['AAL']

76

77 for s in lst_stocks:

78 # 绘制每个股票收盘价格折线图

79 data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \

80 .loc[:, ['date', 'close']] \

81 .set_index('date') \

82 .plot(kind = 'line',

83 ax = ax)

84 # 更新图示为对应股票名

85 ax.legend(lst_stocks, loc = 5)

86 plt.title('2017年股票收盘价趋势图')

87 plt.yticks(fontsize=14)

88 plt.ylim(0,100)

89 plt.show()

90

91 import matplotlib.pyplot as plt

92 import pandas as pd

93

94 # 读取股票数据

95 data = pd.read_csv('D:\python\股票数据集.csv')

96

97 # 合并多个数据到一个数据集中

98 data = data[['date', 'close']]

99 data = data.groupby('date').sum()

100

101 # 绘制折线图

102 plt.plot(data.index, data['close'])

103

104 # 设置标题和轴标签

105 plt.title('Stock Price')

106 plt.xlabel('Date')

107 plt.ylabel('Close')

108

109 # 显示图表

110 plt.show()

111

112 import pandas as pd

113 # 读取数据集

114 data = pd.read_csv('D:\python\股票数据集.csv')

115 # 统计某列不同数据的名称并输出

116 names = data['Name'].unique()

117 print(names)

118

119

120 # 设置坐标周和图表大小。

121 fig, ax = plt.subplots(figsize = (8,6))

122 # 将以下列表替换为您想要绘制的股票名称列表

123 lst_stocks = ['AAL','ABBV','ZION','ZTS','AAPL','AAP']

124 for s in lst_stocks:

125 # 绘制每个股票收盘价格折线图

126 data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \

127 .loc[:, ['date', 'close']] \

128 .set_index('date') \

129 .plot(kind = 'line',

130 ax = ax)

131 # 更新图示为对应股票名

132 ax.legend(lst_stocks, loc = 5)

133 plt.title('2017年股票收盘价趋势图')

134 plt.yticks(fontsize=14)

135 plt.ylim(0,200)

136 plt.show()

137

138 # 计算移动平均值。

139 df_amzn = data[data['stock_name'] == 'AAP'].copy()

140 df_amzn['thirty_ma'] = df_amzn.close.rolling(window = 30).mean()

141 df_amzn['sisty_ma'] = df_amzn.close.rolling(window = 60).mean()

142 df_amzn['ninety_ma'] = df_amzn.close.rolling(window = 90).mean()

143

144 # 生成坐标轴并定义图表大小。

145 fig, ax = plt.subplots(figsize = (8,6))

146 # 使用循环生成4条折线

147 lst_col = ['close', 'thirty_ma', 'sisty_ma', 'ninety_ma']

148 for c in lst_col:

149 df_amzn[df_amzn['date'].dt.year == 2017] \

150 .loc[:, ['date', c]] \

151 .set_index('date') \

152 .plot(kind = 'line',

153 ax = ax,

154 title = '2017 AAP股价趋势图')

155 # 更新标签

156 lst_led = ['日收盘价', '30日线', '60日线', '90日线']

157 ax.legend(lst_led)

158 plt.show()

159

160 # 计算移动平均值。

161 df_abbv = data[data['stock_name'] == 'AAPL'].copy()

162 df_abbv['thirty_ma'] = df_abbv.close.rolling(window = 30).mean()

163 df_abbv['sisty_ma'] = df_abbv.close.rolling(window = 60).mean()

164 df_abbv['ninety_ma'] = df_abbv.close.rolling(window = 90).mean()

165

166 # 生成坐标轴并定义图表大小。

167 fig, ax = plt.subplots(figsize = (8,6))

168

169 # 使用循环生成4条折线

170 lst_col = ['close', 'thirty_ma', 'sisty_ma', 'ninety_ma']

171 for c in lst_col:

172 df_abbv[df_abbv['date'].dt.year == 2017] \

173 .loc[:, ['date', c]] \

174 .set_index('date') \

175 .plot(kind = 'line',

176 ax = ax,

177 title = '2017 AAPL股价趋势图')

178

179 # 更新标签

180 lst_led = ['日收盘价', '30日线', '60日线', '90日线']

181 ax.legend(lst_led)

182 plt.show()

183

184 data = data.loc[data['stock_name'].isin(['AAL', 'ABBV','ZION','ZTS','AAPL','AAP'])]

185 # 使用boxplot画出箱线图

186 data \

187 .loc[:, ['stock_name','close']] \

188 .boxplot(by = 'stock_name',

189 figsize = (8,6)) \

190 .set(xlabel=None)

191 plt.suptitle('')

192 plt.title('2017年收盘价箱图')

193 plt.show()

194

195 # 使用boxplot可以画出简单k线图

196 df_amzn = data[data['stock_name'] == 'AAP'].copy()

197 df_amzn \

198 .loc[:, ['month','close']] \

199 .boxplot(by = 'month',

200 figsize = (8,6)) \

201 .set(xlabel=None)

202 plt.suptitle('')

203 plt.title('AAP2017年月k图')

204 plt.show()

205

206 # 使用boxplot可以画出简单k线图

207 df_AAPL = data[data['stock_name'] == 'AAPL'].copy()

208 df_AAPL \

209 .loc[:, ['month','close']] \

210 .boxplot(by = 'month',

211 figsize = (8,6)) \

212 .set(xlabel=None)

213 plt.suptitle('')

214 plt.title('AAPL2017年月k图')

215 plt.show()

216

217 # 使用boxplot可以画出简单k线图

218 df_amzn \

219 .groupby('month')['volume'] \

220 .mean() \

221 .plot(kind = 'bar')

222 plt.title('AAP2017年月均交易量图')

223 plt.show()

224

225 # 使用boxplot可以画出简单k线图

226 df_AAPL \

227 .groupby('month')['volume'] \

228 .mean() \

229 .plot(kind = 'bar')

230 plt.title('AAPL2017年月均交易量图')

231 plt.show()

232

233 # 设置画布

234 fig, ax = plt.subplots(1,2, figsize = (9,4))

235

236 df_amzn \

237 .loc[:, ['month','close']] \

238 .boxplot(by = 'month',

239 figsize = (8,6),

240 ax = ax[0]) \

241 .set(xlabel=None, title = 'AAP2017年月k图')

242 plt.suptitle('')

243 df_amzn \

244 .groupby('month')['volume'] \

245 .mean() \

246 .plot(kind = 'bar',

247 ax = ax[1],

248 title = 'AAP2017年月均交易量图')

249 plt.show()

250

251

252 # 设置画布

253 fig, ax = plt.subplots(1,2, figsize = (9,4))

254

255 df_AAPL \

256 .loc[:, ['month','close']] \

257 .boxplot(by = 'month',

258 figsize = (8,6),

259 ax = ax[0]) \

260 .set(xlabel=None, title = 'AAPL2017年月k图')

261 plt.suptitle('')

262 df_AAPL \

263 .groupby('month')['volume'] \

264 .mean() \

265 .plot(kind = 'bar',

266 ax = ax[1],

267 title = 'AAPL2017年月均交易量图')

268 plt.show()

269

270 # 散点图

271 df_amzn \

272 .loc[:, ['close', 'volume']] \

273 .plot(x = 'close', y = 'volume',

274 kind = 'scatter',

275 figsize = (8,6),

276 color = 'green',

277 title = 'AAP收盘价与成交量散点图')

278 plt.show()

279 print('AAP收盘价与成交量相关矩阵')

280 df_amzn.loc[:, ['close', 'volume']].corr()

281

282 # 散点图

283 df_AAPL \

284 .loc[:, ['close', 'volume']] \

285 .plot(x = 'close', y = 'volume',

286 kind = 'scatter',

287 figsize = (8,6),

288 color = 'green',

289 title = 'AAPL收盘价与成交量散点图')

290 plt.show()

291 print('AAPL收盘价与成交量相关矩阵')

292 df_amzn.loc[:, ['close', 'volume']].corr()

总结至此,我们学习了:按需求选择图表利用dataframe的函数功能结合\进行换行,使得整体代码整洁。如何解释图表,发现图表传递的信息。