🔥作者主页:疯狂行者🔥 💖✌java领域优质创作者,专注于Java技术领域技术交流✌💖
💖文末获取源码💖
精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻Java精彩实战项目案例
Java精彩新手项目案例
Python精彩新手项目案例
文章目录
# 前言 本文将探讨如何利用Python进行股票数据的可视化分析,结合TensorFlow和LSTM预测算法进行股票价格预测。通过东方财富网的数据爬取和处理,提供一个实用的股票数据分析和预测示例。
一、系统功能
1.1 开发环境
- 开发语言:Python
- 技术:Django
- 数据库:MySQL5.7
- 架构:B/S
- 源码类型:Web
- 编译工具:PyCharm
- 爬虫技术:Selenium
- 算法:TensorFlow + LSTM预测算法模型
二、爬虫及预测
2.1 爬虫概述
为了进行股票数据分析,首先需要从股票市场中获取最新的数据。爬虫技术在这里发挥了重要作用。使用Selenium框架,可以从东方财富网等金融网站自动抓取股票数据,包括股票代码、名称、最新价格、成交量、涨跌幅等信息。这些数据是进行后续分析和预测的基础。
以东方财富网为例,使用Selenium抓取股票数据的基本步骤如下:
打开股票页面。
提取所需的数据字段。
存储到数据库或文件中以备后续处理。
2.2 LSTM预测
利用Python中的Django框架和机器学习库(如pandas和scikit-learn)来对民宿数据进行预处理,并使用随机森林回归模型进行民宿价格预测。以下是具体的逻辑过程:
1.数据准备
从爬虫获取的数据需要进行预处理,包括缺失值处理、归一化等。以下是数据预处理的代码示例:
def fetch_data():
stocks = StocksList.objects.all().values()
df = pd.DataFrame(stocks)
return df
2.数据预处理:
对股票数据进行预处理,将交易金额和最新价格等字段转换为浮点型,确保数据的一致性:
def convert_amount(amount):
if isinstance(amount, str):
if '亿' in amount:
return float(amount.replace('亿', '').strip()) * 1e8
elif '万' in amount:
return float(amount.replace('万', '').strip()) * 1e4
return float(amount)
def preprocess_data(df):
df['stocks_volume'] = df['stocks_volume'].apply(convert_amount)
df['stocks_transaction_amount'] = df['stocks_transaction_amount'].apply(convert_amount)
df['stocks_latest_prince'] = df['stocks_latest_prince'].astype(float)
df['stocks_highest'] = df['stocks_highest'].astype(float)
df['stocks_minimum'] = df['stocks_minimum'].astype(float)
df['open_price'] = df['open_price'].astype(float)
df['close_price'] = df['close_price'].astype(float)
return df
3.模型构建与训练:
3.1 模型构建
使用Keras构建LSTM模型,设置固定的超参数(用超参数进行调优):
PARAMS = {
'lstm_units': 128,
'dropout_rate': 0.2,
'learning_rate': 0.0001,
'activation': 'relu',
'epochs': 50,
'batch_size': 32
}
def build_model(input_shape):
model = Sequential()
model.add(LSTM(PARAMS['lstm_units'], return_sequences=True, input_shape=(input_shape, 1),
activation=PARAMS['activation']))
model.add(Dropout(PARAMS['dropout_rate']))
model.add(LSTM(PARAMS['lstm_units'], activation=PARAMS['activation']))
model.add(Dropout(PARAMS['dropout_rate']))
model.add(Dense(1))
optimizer = Adam(learning_rate=PARAMS['learning_rate'])
model.compile(optimizer=optimizer, loss='mean_squared_error')
return model
4.数据标准化与训练:
对数据进行标准化处理,使用LSTM模型进行训练,并评估模型性能:。
def train_and_evaluate(df, features, target):
scaler_X = MinMaxScaler()
scaler_y = MinMaxScaler()
X = df[features].values
y = df[target].values
X_scaled = scaler_X.fit_transform(X)
y_scaled = scaler_y.fit_transform(y.reshape(-1, 1))
X_scaled = np.reshape(X_scaled, (X_scaled.shape[0], X_scaled.shape[1], 1))
model = build_model(X_scaled.shape[1])
model.fit(X_scaled, y_scaled, epochs=PARAMS['epochs'], batch_size=PARAMS['batch_size'], verbose=1)
y_pred = model.predict(X_scaled)
y_scaled = scaler_y.inverse_transform(y_scaled)
y_pred = scaler_y.inverse_transform(y_pred)
mse = np.mean((y_scaled - y_pred) ** 2)
rmse = np.sqrt(mse)
mae = np.mean(np.abs(y_scaled - y_pred))
print(f"参数组合 {PARAMS} 的平均均方误差 (MSE):", mse)
print(f"参数组合 {PARAMS} 的平均均方根误差 (RMSE):", rmse)
print(f"参数组合 {PARAMS} 的平均绝对误差 (MAE):", mae)
model_path = BASE_DIR / 'StocksTrain' / 'tools' / 'final_model.h5'
scaler_X_path = BASE_DIR / 'StocksTrain' / 'tools' / 'scaler_X.pkl'
scaler_y_path = BASE_DIR / 'StocksTrain' / 'tools' / 'scaler_y.pkl'
model.save(model_path)
joblib.dump(scaler_X, scaler_X_path)
joblib.dump(scaler_y, scaler_y_path)
print(f"模型已保存为 '{model_path}'")
print(f"缩放器已保存为 '{scaler_X_path}' 和 '{scaler_y_path}'")
5.模型评估结果:
三、部分功能展示
☀️爬虫股票☀️
☀️登录☀️
☀️首页展示☀️
☀️股票数据管理展示☀️
☀️股票标题词云展示☀️
☀️股票价格趋势分析 趋势图☀️
☀️股票涨跌幅分布分析 直方图☀️
☀️成交量与成交额散点图☀️
☀️股票类别分布花式饼图☀️
☀️股票类型与成交额关系图☀️
☀️股票收盘价预测☀️
四、部分代码设计
4.1.词云生成【代码如下(示例):】
#词云生成
def generate_wordcloud(request):
# 初始化 WordCloudGenerator 实例
staticImg = BASE_DIR / "static" / "2.jpg"
stocksCloudImg = BASE_DIR / "static" / "stocksCloud.jpg"
generator = WordCloudGenerator(staticImg, stocksCloudImg)
generator.generate_wordcloud()
# 返回生成的词云图片
with open(stocksCloudImg, 'rb') as img_file:
return HttpResponse(img_file.read(), content_type='image/jpeg')
4.2.股票管理之查询股票【代码如下(示例):】
#跳转股票管理界面,并查询数据
def stocksList_views(request):
stocksList_data = {}
# 读取数据库,查询股票数据
StocksLists = StocksList.objects.all()
# 设置每页显示的数量
paginator = Paginator(StocksLists, 10) # 每页显示10条记录
# 获取当前页码
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
stocksList_data["page_obj"] = page_obj
stocksList_data['arrResult'] = page_obj.object_list # 只传递当前页的数据
# 设置 X-Frame-Options 响应头为 SAMEORIGIN
response = render(request, 'admin/stocksList.html', stocksList_data)
response['X-Frame-Options'] = 'SAMEORIGIN'
return response
4.3.查询股票详情,并查询数据【代码如下(示例):】
#跳转民宿评论管理界面,并查询数据
#查询股票详情
def stocks_detail_view(request):
if request.method == 'POST':
stock_id = request.POST.get('id')
try:
StocksLists = StocksList.objects.get(id=stock_id)
data = {
'stockType': StocksLists.stockType,
'stocks_code': StocksLists.stocks_code,
'stocks_name': StocksLists.stocks_name,
'stocks_url': StocksLists.stocks_url,
'stocks_latest_prince': StocksLists.stocks_latest_prince,
'stocks_range': StocksLists.stocks_range,
'stocks_amount': StocksLists.stocks_amount,
'stocks_volume': StocksLists.stocks_volume,
'stocks_transaction_amount': StocksLists.stocks_transaction_amount,
'stocks_highest': StocksLists.stocks_highest,
'stocks_minimum': StocksLists.stocks_minimum,
'open_price': StocksLists.open_price,
'close_price': StocksLists.close_price
}
return JsonResponse({'status': 'success', 'data': data})
except StocksList.DoesNotExist:
return JsonResponse({'status': 'error', 'message': 'Homestay not found'})
总结
源码获取:
大家点赞、收藏、关注、评论啦 、
打卡 文章 更新 113/ 365天
精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻
Java精彩实战项目案例
Java精彩新手项目案例
Python精彩新手项目案例