honghong1025wo

【Python高级应用课程设计 】大数据分析——股票分析

一、选题背景
在动态且复杂的金融市场中,股票价格分析一直是投资者和分析师关注的焦点。准确的股票价格预测对于指导投资决策、管理财务风险以及理解市场动态具有至关重要的作用。随着计算机科学的飞速发展,数据分析和机器学习技术已经成为现代金融分析不可或缺的工具,它们能够揭示价格趋势、评估市场情绪并预测未来市场的可能走向。

二、大数据的分析设计方案

本项目的核心目标是通过一系列统计和机器学习技术来分析和预测一支特定股票的价格走势。项目的动机来源于以下几个层面:
市场需求:投资者需要了解股票的潜在价值和市场趋势,以便作出明智的投资选择。
风险管理:通过预测分析帮助投资者和金融机构评估和管理投资组合的风险。
算法发展:随着算法研究的深入,新的预测模型不断被提出,这些模型需要在实际市场数据上进行验证和优化。
在这个项目中,我们将关注以下几个关键问题:
如何处理和理解历史股票数据?
哪些统计指标对于股票价格分析至关重要?
时间序列模型(如ARIMA)和机器学习模型(如随机森林)在股票价格预测中的应用和表现如何?
如何通过移动平均线来揭示价格的短期和中期趋势?
模型的预测结果与实际市场表现的吻合程度如何?
将使用的数据集包含股票的开盘价、最高价、最低价、收盘价和交易量等信息。通过对这些数据的分析,旨在构建一个可以准确捕捉市场趋势并提供未来

三、数据分析步骤

1、数据源

https://www.tushare.pro/

 

复制代码
 1 # 数据来源
 2 # 见如下代码,爬取于tushare网站
 3 
 4 !pip install tushare
 5 
 6 import tushare as ts
 7 import pandas as pd
 8 import matplotlib.pyplot as plt
 9 import os
10 
11 # 设置plt参数以确保中文显示
12 plt.rcParams['font.sans-serif'] = ['SimHei']
13 
14 # 设置TuShare token
15 ts.set_token('058b7d4cbd6c87585cfab1c0d50890de9125ef9d7599b66c1042e063')
16 pro = ts.pro_api()
17 
18 def get_data(code, start, end):
19     df = pro.daily(ts_code=code, autype='qfq', start_date=start, end_date=end)
20     
21     # 打印df,查看其内容
22     print("Data returned from TuShare:")
23     print(df.head())
24     
25     if df.empty or 'trade_date' not in df.columns:
26         print("No data returned or 'trade_date' not in data. Check code, dates, and token permissions.")
27         return pd.DataFrame()  # 返回空的DataFrame
28     
29     df.index = pd.to_datetime(df.trade_date)
30     df = df[['open', 'high', 'low', 'close', 'vol']]
31     return df
32 
33 
34 def acquire_code(inp_code, inp_start, inp_end):
35     # 获取数据
36     df = get_data(inp_code, inp_start, inp_end)
37     df.sort_index(inplace=True)
38     
39     # 创建保存数据的目录如果它不存在
40     if not os.path.exists('data'):
41         os.mkdir('data')
42     
43     # 保存数据到CSV
44     path = os.path.join('data', inp_code + ".csv")
45     print("File will be saved to:", path)
46     df.to_csv(path)
47     print(path)
48 
49 # 调用函数并传递参数
50 acquire_code('600893.SH', '20210101', '20231210') 
复制代码

 

 

 

2、数据清洗

导入的库、数据清洗

复制代码
 1 # 导入所需的库
 2 import pandas as pd
 3 import numpy as np
 4 import matplotlib.pyplot as plt
 5 
 6 
 7 import matplotlib.pyplot as plt
 8 plt.rcParams['font.sans-serif'] = ['SimHei']  
 9 plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号
10 
11 # 加载数据
12 file_path = r'C:\Users\hongzhiqi\Desktop\Untitled Folder\data\600893.SH.xlsx'  
13 stock_data = pd.read_excel(file_path)
14 
15 # 数据概览,查看前几行数据
16 print(stock_data.head())
17 
18 # 数据清洗
19 # 假设我们需要处理缺失值,可以用以下代码
20 stock_data = stock_data.dropna()  # 删除缺失值
21 
22 # 计算统计指标,例如日收益率
复制代码

 

3、大数据分析过程以及采用的算法

通过计算日收益率、波动率、夏普比率来推算该股票风险和回报率

复制代码
 1 # 计算统计指标,例如日收益率
 2 stock_data['Daily_Return'] = stock_data['close'].pct_change()
 3 
 4 # 描述性统计分析
 5 print(stock_data['Daily_Return'].describe())
 6 
 7 # 绘制收盘价图
 8 plt.figure(figsize=(10, 6))
 9 plt.plot(stock_data['close'])
10 plt.title('收盘价走势图')
11 plt.xlabel('日期')
12 plt.ylabel('收盘价')
13 plt.show()
14 
15 # 绘制日收益率的直方图
16 plt.figure(figsize=(10, 6))
17 plt.hist(stock_data['Daily_Return'].dropna(), bins=50, color='blue')
18 plt.title('日收益率分布')
19 plt.xlabel('日收益率')
20 plt.ylabel('频数')
21 plt.show()
22 
23 # 1. 计算日收益率
24 stock_data['daily_return'] = stock_data['close'].pct_change()
25 
26 # 2. 计算波动率(年化)
27 # 默认252个交易日,可以根据具体市场调整
28 annual_volatility = stock_data['daily_return'].std() * np.sqrt(252)
29 print("Annual Volatility:", annual_volatility)
30 
31 # 3. 计算夏普比率
32 # 假设无风险收益率为3%,也可以根据实际情况调整
33 risk_free_rate = 0.03
34 sharp_ratio = (stock_data['daily_return'].mean() - risk_free_rate) / stock_data['daily_return'].std() * np.sqrt(252)
35 print("Sharp Ratio:", sharp_ratio)
36 
37 # 4. 计算最大回撤
38 # 定义一个函数来计算最大回撤
39 def max_drawdown(return_series):
40     # 累计最大回报
41     cumulative_returns = (1 + return_series).cumprod()
42     # 通过expanding.min()计算当前回撤
43     max_return = cumulative_returns.expanding(min_periods=1).max()
44     # 计算最大回撤
45     drawdown = (cumulative_returns - max_return) / max_return
46     # 返回最大回撤
47     return drawdown.min()
48 
49 max_drawdown_value = max_drawdown(stock_data['daily_return'])
复制代码

 

 

 

 



 

平均日收益率(mean)接近于0,意味着在观察期内,平均来说,每天的收益率接近于无变化。
标准差(std)表示收益率的波动程度,这个值越大,代表股票价格的波动越大,风险也相对较高。
最大和最小值显示了观察期内收益率的极端值,提供了可能的最佳和最差情景。
 年化波动率 (Annual Volatility): 0.4423,年化波动率是衡量资产价格变动幅度的指标,具体来说是0.4423或44.23%。
这意味着该股票价格在一年内的波动范围相对较大,表明其价格变化相对剧烈,波动性高。
 对于投资者来说,高波动率可能意味着高风险,因为资产价值可能会迅速变化,但同时也可能带来较高的投资回报潜力。
 夏普比率 (Sharp Ratio): -17.3738,夏普比率是衡量资产调整后风险的收益的指标。通常,一个正的夏普比率表明投资者能获得超过无风险利率的回报。
 这里夏普比率为-17.3738,是一个非常低的负值,这通常指示一个不理想的投资。它可能意味着资产的平均回报率低于无风险利率,或者资产的波动性非常高,导致风险调整后的回报率非常低。
这个极低的夏普比率可能提示投资者这是一个高风险且回报不足的投资选项。
最大回撤 (Max Drawdown): -0.5822 or -58.22%,最大回撤是衡量资产从峰值下降到谷底的最大百分比跌幅。这里的最大回撤是-58.22%,表示股票从其历史最高点下跌了超过一半的价值。
 这是一个重要的风险指标,因为它可以告诉投资者他们可能面临的最大亏损。在这种情况下,-58.22%的最大回撤表明该股票在观察期内经历了极大的价值下降,这对于风险厌恶的投资者可能是一个警告信号。
 这三个指标共同揭示了该股票具有高波动性、低风险调整回报率和在观察期内经历了显著的最大价值下降。
 
这个OLS回归结果摘要显示了使用线性回归模型对股票的收盘价进行预测时的各种统计指标
复制代码
 1 import numpy as np
 2 import pandas as pd
 3 import statsmodels.api as sm
 4 
 5 # 线性回归模型(OLS)
 6 # 构建时间序列作为自变量
 7 stock_data['Time'] = np.arange(len(stock_data))
 8 
 9 # OLS模型
10 X = sm.add_constant(stock_data['Time'])  # 添加常数项
11 y = stock_data['close']
12 model = sm.OLS(y, X).fit()
13 
14 # 预测
15 stock_data['Predicted'] = model.predict(X)
16 
17 # 绘制结果
18 plt.figure(figsize=(12,6))
19 plt.plot(stock_data['close'], label='Actual')
20 plt.plot(stock_data['Predicted'], label='Predicted', color='red')
21 plt.title('Stock Price Prediction with OLS')
22 plt.legend()
23 plt.show()
24 
25 # 打印模型摘要
26 print(model.summary())
复制代码

 

 

在这个特定的时间段内,模型似乎捕捉到了价格上涨的趋势,但实际应用中需要谨慎对待,因为股市往往存在很高的不可预测性。
还需要注意的是,置信区间虽然提供了预测的不确定性范围,但不应被理解为价格将一定在这个范围内波动。
总的来说,图表展示了ARIMA模型对历史数据进行了良好的拟合,并且对未来的价格走势提供了合理的预测,同时也展现了预测的不确定性。

4、数据可视化

绘制股票的K线图、成交量、移动平均线并进行分析

复制代码
 1 !pip install mplfinance
 2 import pandas as pd
 3 import mplfinance as mpf
 4 
 5 print(stock_data.columns)
 6 
 7 
 8 # 假设'stock_data'中有一个名为'date'的列,我们首先将其转换为日期时间格式
 9 stock_data['trade_date'] = pd.to_datetime(stock_data['trade_date'])
10 
11 # 然后将'date'列设置为索引
12 stock_data.set_index('trade_date', inplace=True)
13 
14 # 确保'volume'列的名字正确
15 stock_data.rename(columns={'vol': 'volume'}, inplace=True)
16 
17 # 计算10日和30日移动平均线
18 stock_data['MA10'] = stock_data['close'].rolling(window=10).mean()
19 stock_data['MA30'] = stock_data['close'].rolling(window=30).mean()
20 
21 
22 # 打印当前DataFrame的列名
23 print(stock_data.columns)
24 
25 
26 # 选择绘图所需的列
27 ohlc = stock_data[['open', 'high', 'low', 'close', 'volume']]
28 
29 # 绘制K线图、成交量和移动平均线
30 mpf.plot(ohlc, type='candle', mav=(10, 30), volume=True, figratio=(12,8), 
31          title="Stock Price and Volume with Moving Averages", style='yahoo')
复制代码

 

 

股票价格在2021年初经历了一个上涨期,随后在中期有所下跌,并在之后的几个月内持续波动。
从整体趋势来看,股票经历了一个高点后逐渐下降,进入了一个下降趋势。
两条线在2021年中旬之后多次交叉,表明市场在这段时间内的方向不明确,呈现出一定的震荡行情。
时间轴显示了从2021年初到2023年底的时间跨度。可以看出,随着时间的推移,股价整体呈下降趋势。
 
 
 
股票的实际价格与其10日移动平均线(MA10)
复制代码
 1 # 移动平均模型
 2 # 设置移动平均的窗口大小,例如10日
 3 window_size = 10
 4 
 5 # 计算移动平均
 6 stock_data['MA10'] = stock_data['close'].rolling(window=window_size).mean()
 7 
 8 # 绘制结果
 9 plt.figure(figsize=(12,6))
10 plt.plot(stock_data['close'], label='Actual')
11 plt.plot(stock_data['MA10'], label='MA10', color='orange')
12 plt.title('Stock Price with 10-day Moving Average')
13 plt.legend()
14 plt.show()
复制代码

 

实际价格:蓝色线表示股票每日的实际收盘价格。它显示了价格随时间的波动性,包括所有的高点和低点。

 

 总代码

 

复制代码
  1 !pip install tushare
  2 import tushare as ts
  3 import pandas as pd
  4 import matplotlib.pyplot as plt
  5 import os
  6 # 设置plt参数以确保中文显示
  7 plt.rcParams['font.sans-serif'] = ['SimHei']
  8 # 设置TuShare token
  9 ts.set_token('058b7d4cbd6c87585cfab1c0d50890de9125ef9d7599b66c1042e063')
 10 pro = ts.pro_api()
 11 def get_data(code, start, end):
 12     df = pro.daily(ts_code=code, autype='qfq', start_date=start, end_date=end)
 13     
 14     # 打印df,查看其内容
 15     print("Data returned from TuShare:")
 16     print(df.head())
 17     
 18     if df.empty or 'trade_date' not in df.columns:
 19         print("No data returned or 'trade_date' not in data. Check code, dates, and token permissions.")
 20         return pd.DataFrame()  # 返回空的DataFrame
 21     df.index = pd.to_datetime(df.trade_date)
 22     df = df[['open', 'high', 'low', 'close', 'vol']]
 23     return df
 24 
 25 
 26 def acquire_code(inp_code, inp_start, inp_end):
 27     # 获取数据
 28     df = get_data(inp_code, inp_start, inp_end)
 29     df.sort_index(inplace=True)
 30     
 31     # 创建保存数据的目录如果它不存在
 32     if not os.path.exists('data'):
 33         os.mkdir('data')
 34     
 35     # 保存数据到CSV
 36     path = os.path.join('data', inp_code + ".csv")
 37     print("File will be saved to:", path)
 38     df.to_csv(path)
 39     print(path)
 40 
 41 # 调用函数并传递参数
 42 acquire_code('600893.SH', '20210101', '20231210') 
 43 
 44 # 导入所需的库
 45 import pandas as pd
 46 import numpy as np
 47 import matplotlib.pyplot as plt
 48 plt.rcParams['font.sans-serif'] = ['SimHei']  
 49 plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号
 50 
 51 # 加载数据
 52 file_path = r'C:\Users\hongzhiqi\Desktop\Untitled Folder\data\600893.SH.xlsx'  
 53 stock_data = pd.read_excel(file_path)
 54 
 55 # 数据概览,查看前几行数据
 56 print(stock_data.head())
 57 
 58 # #数据清、洗假设我们需要处理缺失值,可以用以下代码
 59 stock_data = stock_data.dropna()  # 删除缺失值
 60 
 61 # 计算统计指标,例如日收益率
 62 stock_data['Daily_Return'] = stock_data['close'].pct_change()
 63 # 描述性统计分析
 64 print(stock_data['Daily_Return'].describe())
 65 # 绘制收盘价图
 66 plt.figure(figsize=(10, 6))
 67 plt.plot(stock_data['close'])
 68 plt.title('收盘价走势图')
 69 plt.xlabel('日期')
 70 plt.ylabel('收盘价')
 71 plt.show()
 72 
 73 # 绘制日收益率的直方图
 74 plt.figure(figsize=(10, 6))
 75 plt.hist(stock_data['Daily_Return'].dropna(), bins=50, color='blue')
 76 plt.title('日收益率分布')
 77 plt.xlabel('日收益率')
 78 plt.ylabel('频数')
 79 plt.show()
 80 
 81 # 1. 计算日收益率
 82 stock_data['daily_return'] = stock_data['close'].pct_change()
 83 # 2. 计算波动率(年化)
 84 # 默认252个交易日,可以根据具体市场调整
 85 annual_volatility = stock_data['daily_return'].std() * np.sqrt(252)
 86 print("Annual Volatility:", annual_volatility)
 87 # 3. 计算夏普比率
 88 # 假设无风险收益率为3%,也可以根据实际情况调整
 89 risk_free_rate = 0.03
 90 sharp_ratio = (stock_data['daily_return'].mean() - risk_free_rate) / stock_data['daily_return'].std() * np.sqrt(252)
 91 print("Sharp Ratio:", sharp_ratio)
 92 # 4. 计算最大回撤
 93 # 定义一个函数来计算最大回撤
 94 def max_drawdown(return_series):
 95     # 累计最大回报
 96     cumulative_returns = (1 + return_series).cumprod()
 97     # 通过expanding.min()计算当前回撤
 98     max_return = cumulative_returns.expanding(min_periods=1).max()
 99     # 计算最大回撤
100     drawdown = (cumulative_returns - max_return) / max_return
101     # 返回最大回撤
102     return drawdown.min()
103 
104 max_drawdown_value = max_drawdown(stock_data['daily_return'])
105 import seaborn as sns  # 用于绘制热力图
106 # 假设stock_data是包含股票价格和其他信息的DataFrame
107 
108 # 绘制收盘价的散点图
109 plt.figure(figsize=(10, 6))
110 plt.scatter(stock_data.index, stock_data['close'], alpha=0.5)
111 plt.title('收盘价散点图')
112 plt.xlabel('日期')
113 plt.ylabel('收盘价')
114 plt.show()
115 
116 # 绘制收盘价的箱线图
117 plt.figure(figsize=(10, 6))
118 plt.boxplot(stock_data['close'].dropna(), vert=False)  # 删除NA值,垂直方向为False
119 plt.title('收盘价箱线图')
120 plt.xlabel('收盘价')
121 plt.show()
122 
123 # 计算并绘制相关性热力图
124 correlation_matrix = stock_data[['open', 'high', 'low', 'close', 'vol']].corr()
125 plt.figure(figsize=(10, 8))
126 sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', linewidths=0.5)
127 plt.title('股票价格属性的相关性热力图')
128 plt.show()
129 import numpy as np
130 import pandas as pd
131 import statsmodels.api as sm
132 
133 # 线性回归模型(OLS)
134 # 构建时间序列作为自变量
135 stock_data['Time'] = np.arange(len(stock_data))
136 
137 # OLS模型
138 X = sm.add_constant(stock_data['Time'])  # 添加常数项
139 y = stock_data['close']
140 model = sm.OLS(y, X).fit()
141 
142 # 预测
143 stock_data['Predicted'] = model.predict(X)
144 # 绘制结果
145 plt.figure(figsize=(12,6))
146 plt.plot(stock_data['close'], label='Actual')
147 plt.plot(stock_data['Predicted'], label='Predicted', color='red')
148 plt.title('Stock Price Prediction with OLS')
149 plt.legend()
150 plt.show()
151 # 打印模型摘要
152 print(model.summary())
153 stock_data['SMA20'] = stock_data['close'].rolling(window=20).mean()
154 # 绘制结果
155 plt.figure(figsize=(12,6))
156 plt.plot(stock_data['close'], label='Actual')
157 plt.plot(stock_data['SMA20'], label='SMA20', color='purple')
158 plt.title('Stock Price with 20-day Simple Moving Average')
159 plt.legend()
160 plt.show()
161 
162 from sklearn.ensemble import RandomForestRegressor
163 from sklearn.svm import SVR
164 from sklearn.model_selection import train_test_split
165 from statsmodels.tsa.seasonal import seasonal_decompose
166 
167 # 4. 时间序列分解
168 # 这个方法将时间序列分解为趋势、季节性和残差成分
169 decomposition = seasonal_decompose(stock_data['close'], period=30)  # period需要根据数据频率调整
170 # 绘制分解结果
171 fig = decomposition.plot()
172 fig.set_size_inches(15, 8)
173 plt.show()
174 
175 # 5. 随机森林回归
176 # 准备数据
177 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
178 # 随机森林模型
179 rf = RandomForestRegressor(n_estimators=100, random_state=42)
180 rf.fit(X_train, y_train)
181 # 预测
182 stock_data['RF_Predicted'] = rf.predict(X)
183 # 绘制结果
184 plt.figure(figsize=(12,6))
185 plt.plot(stock_data['close'], label='Actual')
186 plt.plot(stock_data.index, stock_data['RF_Predicted'], label='RF Predicted', color='cyan')
187 plt.title('Stock Price Prediction with Random Forest')
188 plt.legend()
189 plt.show()
190 
191 # 6. 支持向量机回归(SVR)
192 svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)  # RBF核
193 svr_rbf.fit(X_train, y_train)
194 # 预测
195 stock_data['SVR_Predicted'] = svr_rbf.predict(X)
196 # 绘制结果
197 plt.figure(figsize=(12,6))
198 plt.plot(stock_data['close'], label='Actual')
199 plt.plot(stock_data.index, stock_data['SVR_Predicted'], label='SVR Predicted', color='magenta')
200 plt.title('Stock Price Prediction with SVR')
201 plt.legend()
202 plt.show()
203 # 打印模型性能指标(例如,均方误差)来比较模型
204 from sklearn.metrics import mean_squared_error
205 print("RF MSE:", mean_squared_error(y_test, rf.predict(X_test)))
206 print("SVR MSE:", mean_squared_error(y_test, svr_rbf.predict(X_test)))
207 
208 !pip install keras
209 !pip install tensorflow
210 from sklearn.decomposition import PCA
211 from keras.models import Sequential
212 from keras.layers import Dense, LSTM, Dropout, Conv1D, MaxPooling1D, Flatten
213 from sklearn.preprocessing import MinMaxScaler
214 # 数据标准化
215 scaler = MinMaxScaler(feature_range=(0, 1))
216 scaled_close = scaler.fit_transform(stock_data['close'].values.reshape(-1,1))
217 
218 # 7. LSTM(长短期记忆网络)
219 # 准备数据
220 def prepare_data(timeseries_data, n_features):
221     X, y = [], []
222     for i in range(len(timeseries_data)):
223         end_ix = i + n_features
224         if end_ix > len(timeseries_data)-1:
225             break
226         seq_x, seq_y = timeseries_data[i:end_ix], timeseries_data[end_ix]
227         X.append(seq_x)
228         y.append(seq_y)
229     return np.array(X), np.array(y)
230 n_features = 5  # 使用5天的数据预测下一天
231 X, y = prepare_data(scaled_close, n_features)
232 # 划分数据为训练和测试集
233 n_train = int(len(X) * 0.8)
234 X_train, y_train = X[:n_train], y[:n_train]
235 X_test, y_test = X[n_train:], y[n_train:]
236 
237 # 构建LSTM模型
238 lstm_model = Sequential()
239 lstm_model.add(LSTM(units=50, return_sequences=True, input_shape=(n_features,1)))
240 lstm_model.add(LSTM(units=50))
241 lstm_model.add(Dense(1))
242 lstm_model.compile(optimizer='adam', loss='mean_squared_error')
243 lstm_model.fit(X_train, y_train, epochs=100, batch_size=32)
244 # 预测
245 predicted_stock_price = lstm_model.predict(X_test)
246 predicted_stock_price = scaler.inverse_transform(predicted_stock_price)  # 反标准化
247 # 绘制结果
248 plt.figure(figsize=(12,6))
249 plt.plot(scaler.inverse_transform(y_test.reshape(-1,1)), label='Actual')
250 plt.plot(predicted_stock_price, label='Predicted', color='red')
251 plt.title('Stock Price Prediction with LSTM')
252 plt.legend()
253 plt.show()
254 
255 # 8. 卷积神经网络(CNN)
256 cnn_model = Sequential()
257 cnn_model.add(Conv1D(filters=64, kernel_size=2, activation='relu', input_shape=(n_features, 1)))
258 cnn_model.add(MaxPooling1D(pool_size=2))
259 cnn_model.add(Flatten())
260 cnn_model.add(Dense(50, activation='relu'))
261 cnn_model.add(Dense(1))
262 cnn_model.compile(optimizer='adam', loss='mean_squared_error')
263 # 训练模型
264 cnn_model.fit(X_train, y_train, epochs=100, batch_size=32)
265 # 预测
266 predicted_stock_price_cnn = cnn_model.predict(X_test)
267 predicted_stock_price_cnn = scaler.inverse_transform(predicted_stock_price_cnn)
268 # 绘制结果
269 plt.figure(figsize=(12,6))
270 plt.plot(scaler.inverse_transform(y_test.reshape(-1,1)), label='Actual')
271 plt.plot(predicted_stock_price_cnn, label='Predicted CNN', color='green')
272 plt.title('Stock Price Prediction with CNN')
273 plt.legend()
274 plt.show()
275 
276 # 9. 时间序列的主成分分析(PCA)
277 # 减少到3个主成分
278 pca = PCA(n_components=3)
279 principalComponents = pca.fit_transform(X.reshape(X.shape[0], -1))
280 principalDf = pd.DataFrame(data=principalComponents, columns=['principal component 1', 'principal component 2', 'principal component 3'])
281 # 查看主成分解释的方差比例
282 print(pca.explained_variance_ratio_)
283 # 可视化第一主成分与实际价格
284 plt.figure(figsize=(12,6))
285 plt.plot(scaler.inverse_transform(y.reshape(-1,1)), label='Actual')
286 plt.plot(principalDf['principal component 1'], label='PCA1', color='purple')
287 plt.title('Comparison of Actual Price and First Principal Component')
288 plt.legend()
289 plt.show()
290 
291 # 移动平均模型
292 # 设置移动平均的窗口大小,例如10日
293 window_size = 10
294 # 计算移动平均
295 stock_data['MA10'] = stock_data['close'].rolling(window=window_size).mean()
296 # 绘制结果
297 plt.figure(figsize=(12,6))
298 plt.plot(stock_data['close'], label='Actual')
299 plt.plot(stock_data['MA10'], label='MA10', color='orange')
300 plt.title('Stock Price with 10-day Moving Average')
301 plt.legend()
302 plt.show()
303 # 绘制股票的K线图、成交量、移动平均线并进行分析。
304 !pip install mplfinance
305 import pandas as pd
306 import mplfinance as mpf
307 print(stock_data.columns)
308 
309 # 假设'stock_data'中有一个名为'date'的列,我们首先将其转换为日期时间格式
310 stock_data['trade_date'] = pd.to_datetime(stock_data['trade_date'])
311 # 然后将'date'列设置为索引
312 stock_data.set_index('trade_date', inplace=True)
313 # 确保'volume'列的名字正确
314 stock_data.rename(columns={'vol': 'volume'}, inplace=True)
315 # 计算10日和30日移动平均线
316 stock_data['MA10'] = stock_data['close'].rolling(window=10).mean()
317 stock_data['MA30'] = stock_data['close'].rolling(window=30).mean()
318 
319 
320 # 打印当前DataFrame的列名
321 print(stock_data.columns)
322 # 选择绘图所需的列
323 ohlc = stock_data[['open', 'high', 'low', 'close', 'volume']]
324 # 绘制K线图、成交量和移动平均线
325 mpf.plot(ohlc, type='candle', mav=(10, 30), volume=True, figratio=(12,8), 
326          title="Stock Price and Volume with Moving Averages", style='yahoo')
327 from statsmodels.tsa.arima.model import ARIMA
328 import pandas as pd
329 import matplotlib.pyplot as plt
330 import numpy as np
331 
332 stock_data = pd.DataFrame({
333     'trade_date': pd.date_range(start='2021-01-01', periods=200, freq='B'),
334     'close': np.random.rand(200).cumsum()  
335 })
336 
337 # 转换日期为数值型,以便进行线性回归
338 stock_data['trade_date'] = pd.to_datetime(stock_data['trade_date'])
339 stock_data['date_num'] = stock_data['trade_date'].map(pd.Timestamp.toordinal)
340 
341 # 使用前150个数据点作为历史数据来拟合模型
342 history = stock_data.iloc[:150]
343 future = stock_data.iloc[150:]
344 
345 # 新的ARIMA模型
346 # 参数(p,d,q)需要根据数据进行调整,这里我们假设为(1,1,1)
347 model_arima = ARIMA(history['close'], order=(1, 1, 1))
348 model_arima_fit = model_arima.fit()
349 # 预测未来50个数据点
350 forecast = model_arima_fit.get_forecast(steps=50)
351 forecast_index = pd.date_range(start=history['trade_date'].iloc[-1], periods=51, freq='B')[1:]
352 forecast_values = forecast.predicted_mean
353 forecast_conf_int = forecast.conf_int()
354 # 可视化预测结果
355 plt.figure(figsize=(14,7))
356 plt.plot(history['trade_date'], history['close'], label='Historical Close Price')
357 plt.plot(future['trade_date'], future['close'], label='Future Actual Close Price', alpha=0.5)
358 plt.plot(forecast_index, forecast_values, label='Predicted Future Close Price', color='red')
359 plt.fill_between(forecast_index, forecast_conf_int.iloc[:, 0], forecast_conf_int.iloc[:, 1], color='pink', alpha=0.3, label='95% Confidence Interval')
360 plt.xlabel('Date')
361 plt.ylabel('Close Price')
362 plt.title('Stock Price Prediction with ARIMA')
363 plt.legend()
364 plt.show()
复制代码

 

 

 

四、总结

1.通过对股票的大数据进行分析和挖掘,可以得到以下结论和目标达成情况:

在进行数据分析后,投资者需要了解股票的潜在价值和市场趋势,以便作出明智的投资选择。同时也可以通过预测分析帮助投资者和金融机构评估和管理投资组合的风险。

2.在完成这个课程设计过程中获得了以下收获:

会了使用Python获取股票数据的方法,包括从金融数据提供商、交易所网站或第三方数据API获取数据。还学会了对数据进行清洗和整理,处理缺失值、异常值等。能够对股票数据进行探索性分析,如何绘制股票价格走势图、交易量柱状图等。通过此设计过程,我提高了数据分析和技术实现的能力,学会了从数据中提取有用的信息和特征,如何做出我想要的结果。

posted on   哄哄哄哄~  阅读(613)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

导航

统计

点击右上角即可分享
微信分享提示