【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'])
标准差(std)表示收益率的波动程度,这个值越大,代表股票价格的波动越大,风险也相对较高。
最大和最小值显示了观察期内收益率的极端值,提供了可能的最佳和最差情景。
对于投资者来说,高波动率可能意味着高风险,因为资产价值可能会迅速变化,但同时也可能带来较高的投资回报潜力。
夏普比率 (Sharp Ratio): -17.3738,夏普比率是衡量资产调整后风险的收益的指标。通常,一个正的夏普比率表明投资者能获得超过无风险利率的回报。
这个极低的夏普比率可能提示投资者这是一个高风险且回报不足的投资选项。
最大回撤 (Max Drawdown): -0.5822 or -58.22%,最大回撤是衡量资产从峰值下降到谷底的最大百分比跌幅。这里的最大回撤是-58.22%,表示股票从其历史最高点下跌了超过一半的价值。
这三个指标共同揭示了该股票具有高波动性、低风险调整回报率和在观察期内经历了显著的最大价值下降。
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')
从整体趋势来看,股票经历了一个高点后逐渐下降,进入了一个下降趋势。
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获取数据。还学会了对数据进行清洗和整理,处理缺失值、异常值等。能够对股票数据进行探索性分析,如何绘制股票价格走势图、交易量柱状图等。通过此设计过程,我提高了数据分析和技术实现的能力,学会了从数据中提取有用的信息和特征,如何做出我想要的结果。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具