基于Python的股票可视化分析+tensorflow+LSTM预测算法 股票爬虫 股票可视化分析(新出)(爬虫东方财富网)

🔥作者主页:疯狂行者🔥 💖✌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精彩新手项目案例

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂行者

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值