大数据:Python股票数据分析与预测系统 LSTM神经网络算法 股票价格预测 Tensorflow深度学习 机器学习 Flask框架 东方财富(源码+论文)✅

博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅

2、大数据毕业设计:2025年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅

1、项目介绍

技术栈:
python语言、Flask框架、Tensorflow深度学习、LSTM神经网络算法股票价格预测、scikit-learn机器学习、东方财富、Echarts可视化、HTML

2、项目界面

(1)涨停板热点分析—热点行业板块涨停板数量分布直方图、不同行业板块的成交额占比分布、当日涨停股票池
在这里插入图片描述

(2)首页—功能模块介绍

在这里插入图片描述

(3)大盘指数行情分析—上证、深证、创业板、中小指、沪深300指数K线图

在这里插入图片描述

(4)个股量化分析—输入股票代码,全方位分析

在这里插入图片描述

(5)大盘资金流向分析—沪深两市实时资金流向、南向实时资金流向

在这里插入图片描述

(6)大盘市场基本面估值分析----市盈率分布、市净率分布

在这里插入图片描述

(7)个股收益量化分析—日收益率、月收益率、累计收益率

在这里插入图片描述

(8)股票价格预测----输入特征值:股票代码、模型时间窗口、测试集占比、训练轮次

在这里插入图片描述

(9)龙虎榜热股排名

在这里插入图片描述

(10)注册登录模块
在这里插入图片描述

3、项目说明

1. 涨停板热点分析

  • 热点行业板块涨停板数量分布直方图:展示当前市场中各个行业板块涨停板数量的分布情况,帮助用户快速了解哪些行业板块表现活跃。
  • 不同行业板块的成交额占比分布:分析各行业板块的成交额占比,反映市场资金的流向和热点板块。
  • 当日涨停股票池:列出当日涨停的股票及其相关信息,方便用户关注热门股票。

2. 首页——功能模块介绍

  • 首页通常会提供项目的整体介绍和各个功能模块的入口。用户可以通过首页快速导航到感兴趣的功能模块,例如涨停板分析、大盘指数行情分析、个股量化分析等。

3. 大盘指数行情分析

  • 展示上证、深证、创业板、中小指、沪深300等主要指数的K线图。通过K线图,用户可以直观地观察指数的历史走势和当前趋势,分析市场的整体表现。

4. 个股量化分析

  • 用户输入股票代码后,系统将对该股票进行全方位分析,包括:
    • 技术指标分析:如均线、MACD、KDJ等,帮助用户判断股票的短期走势。
    • 基本面分析:如市盈率、市净率、股息率等,评估股票的内在价值。
    • 历史数据展示:提供股票的历史价格走势和交易数据。

5. 大盘资金流向分析

  • 沪深两市实时资金流向:展示沪深两市的资金流入流出情况,帮助用户判断市场的资金动向。
  • 南向实时资金流向:分析南向资金的流向,反映外资对市场的态度。

6. 大盘市场基本面估值分析

  • 市盈率分布:展示市场整体或特定板块的市盈率分布情况,帮助用户评估市场的估值水平。
  • 市净率分布:分析市净率的分布,为投资者提供参考。

7. 个股收益量化分析

  • 提供个股的日收益率、月收益率、累计收益率等数据,帮助用户评估股票的投资收益情况。通过这些数据,用户可以更好地了解股票的收益特征和风险水平。

8. 股票价格预测

  • 功能描述
    • 用户输入股票代码、模型时间窗口、测试集占比、训练轮次等参数。
    • 系统利用LSTM神经网络模型对股票价格进行预测,输出未来一段时间内的价格预测结果。
    • 提供预测结果的可视化展示,帮助用户直观地了解预测趋势。
  • 技术实现
    • 使用 TensorFlow 框架构建 LSTM 模型。
    • 通过机器学习算法(如 scikit-learn)进行数据预处理和特征提取。
    • 使用历史价格数据训练模型,并对未来的股票价格进行预测。

9. 龙虎榜热股排名

  • 展示当前市场中龙虎榜上榜的热门股票及其排名。龙虎榜数据通常反映了市场中机构和游资的关注焦点,对投资者具有一定的参考价值。

10. 注册登录模块

  • 功能描述
    • 提供用户注册和登录功能,支持用户名和密码登录。
    • 后台权限管理,限制非管理员身份登录后台,确保数据安全。
  • 技术实现
    • 使用 Flask 框架搭建后端接口,处理用户注册和登录请求。
    • 使用 HTML 和前端技术实现注册和登录界面。

项目说明

基于LSTM神经网络的股票价格预测
  • 原理和流程
    1. 数据收集:通过爬虫技术从东方财富等金融数据源获取股票的历史K线数据。
    2. 数据预处理:对数据进行排序、归一化处理,并划分为训练集和测试集。
    3. 创建数据集:将数据转换为适合LSTM模型的输入格式,例如时间序列数据。
    4. 构建模型:使用 TensorFlow 框架构建LSTM模型,包含LSTM层、Dropout层和输出层。
    5. 训练模型:使用训练集数据对模型进行训练,优化模型参数。
    6. 模型预测:使用训练好的模型对测试集数据进行预测,并计算预测误差。
    7. 结果输出:将预测结果以可视化图表(如Echarts)的形式展示给用户。

这个项目通过整合 Python、Flask、TensorFlow、LSTM 等技术栈,实现了股票价格预测、市场分析、个股量化分析等多种功能,为投资者提供了一个全面、便捷的金融数据分析工具。

4、核心代码

#!/usr/bin/python
# coding=utf-8
from flask import jsonify, Blueprint
import pandas as pd
import numpy as np
import json
from service.stock_spider import EastmoneySpider
from service import tech_util
import service.analysis_util as analysis_util
import random
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM, LSTM
from sklearn.metrics import mean_absolute_error


api_blueprint = Blueprint('api', __name__)

em_spider = EastmoneySpider()


@api_blueprint.route('/search_stock_index/<stock_input>')
def search_stock_index(stock_input):
    """
    搜索大盘指数或个股的行情数据
    """
    market_type = None
    if stock_input == '上证指数':
        stock = {'code': '000001', 'name': '上证指数'}
        market_type = 1
    elif stock_input == '深证成指':
        stock = {'code': '399001', 'name': '深证成指'}
    elif stock_input == '中小板指':
        stock = {'code': '399005', 'name': '中小板指'}
    elif stock_input == '创业板指':
        stock = {'code': '399006', 'name': '创业板指'}
    elif stock_input == '沪深300':
        stock = {'code': '399300', 'name': '沪深300'}
    elif stock_input == '北证50':
        stock = {'code': '899050', 'name': '北证50'}
    else:
        stock = em_spider.stock_index_search(stock_input)

    # 获取该股票的历史数据,前端绘制 K 线图
    # 获取历史K线数据
    stock_df = em_spider.get_stock_kline_factor_datas(security_code=stock['code'], period='day', market_type=market_type)
    stock_df = stock_df[['date', 'open', 'close', 'low', 'high', 'volume']]

    stock_df.sort_values(by='date', ascending=True, inplace=True)
    kline_data = stock_df.values.tolist()

    # 计算 MA 指标
    stock_df['MA5'] = tech_util.MA(stock_df['close'], N=5)
    stock_df['MA10'] = tech_util.MA(stock_df['close'], N=10)
    stock_df['MA20'] = tech_util.MA(stock_df['close'], N=20)
    stock_df['MA60'] = tech_util.MA(stock_df['close'], N=60)

    stock_df.fillna('-', inplace=True)

    return jsonify({
        'name': '{}({})'.format(stock['name'], stock['code']),
        'dates': stock_df['date'].values.tolist(),
        'klines': kline_data,
        'volumes': stock_df['volume'].values.tolist(),
        'tech_datas': {
            'MA5': stock_df['MA5'].values.tolist(),
            'MA10': stock_df['MA10'].values.tolist(),
            'MA20': stock_df['MA20'].values.tolist(),
            'MA60': stock_df['MA60'].values.tolist()
        }
    })


@api_blueprint.route('/query_jibenmian_info/<stock_input>')
def query_jibenmian_info(stock_input):
    """获取基本面信息"""
    stock = em_spider.stock_index_search(stock_input)
    zyzb_table, jgyc_table, gsjj, gsmc = em_spider.get_ji_ben_mian_info(stock['code'])
    # 股票的核心题材
    concept_boards = em_spider.get_stock_core_concepts(stock['code'])
    print(concept_boards)
    
    # 概念板块html
    concept_html = """
    <div class="">
        <div class="card-header">
            <h3>核心概念板块</h3><hr/>
        </div>
        <div class="">
            <table class="table table-hover" style="table-layout:fixed;word-break:break-all;">
            <thead>
                <tr>
                <th scope="col" width="8%">#</th>
                <th scope="col" width="10%">概念板块</th>
                <th scope="col" width="70%">概念解读</th>
                <th scope="col" width="12%">最新涨幅</th>
                </tr>
            </thead>
            <tbody>
                {}
            </tbody>
            </table>
        </div>
        </div>
    """
    trs = ''
    for i, conenpt in enumerate(concept_boards):
        trs += """
        <tr>
            <td>{}</td>
            <td>{}</td>
            <td>{}</td>
            <td style="color: {}">{}%</td>
        </tr>
        """.format(i+1, conenpt['board_name'], conenpt['board_reason'], 'red' if conenpt['board_yield']>0 else 'green' ,conenpt['board_yield'])
    concept_html = concept_html.format(trs)
        
    return jsonify({
        'zyzb_table': zyzb_table,
        'jgyc_table': jgyc_table,
        'gsjj': gsjj,
        'gsmc': gsmc,
        'concept_boards': concept_html
    })
    

@api_blueprint.route('/limitup_analysis/<trade_date>')
def limitup_analysis(trade_date):
    """涨停板热点分析"""
    print(trade_date)
    trade_date = trade_date.replace('-', '')
    limit_up_stocks = em_spider.get_limit_up_stocks(trade_date=trade_date)
    print(json.dumps(limit_up_stocks, ensure_ascii=False))
    
    trs = ''
    concept_counts = {}
    concept_moneys = {}
    for i, stock in enumerate(limit_up_stocks):
        if stock['行业板块'] not in concept_counts:
            concept_counts[stock['行业板块']] = 0
        concept_counts[stock['行业板块']] += 1
        
        if stock['行业板块'] not in concept_moneys:
            concept_moneys[stock['行业板块']] = 0
        concept_moneys[stock['行业板块']] += stock['成交额']
        
        tr = """
        <tr>
            <th scope="row">{}</th>
            <td><a href="http://127.0.0.1:5000/stock_info?search={}" target="_blank">{}</a></td>
            <td><a href="http://127.0.0.1:5000/stock_info?search={}" target="_blank">{}</a></td>
            <td style="color:red">{}%</td>
            <td>{}</td>
            <td>{}</td>
            <td>{}</td>
            <td>{}</td>
            <td>{}</td>
            <td>{}</td>
            <td>{}</td>
            <td>{}</td>
            <td>{}</td>
        </tr>
        """.format(i+1, stock['证券代码'], stock['证券代码'], stock['证券名称'], stock['证券名称'],
                   round(stock['涨跌幅'], 2), stock['最新价'], round(stock['成交额'] / 100000000, 3),
                   round(stock['流通市值'] / 100000000, 3), round(stock['换手率'], 2),
                   round(stock['封板资金'] / 100000000, 3), stock['炸板次数'], 
                   stock['涨停统计'], stock['行业板块'], stock['交易日期'])
        trs += tr
    
    # 行业板块数量分布
    concept_counts = sorted(concept_counts.items(), key=lambda x: x[1], reverse=True)
    print(concept_counts)
    concepts = [c[0] for c in concept_counts]
    # 行业板块资金流入占比

    result = {
        'tbody': trs,
        'concept': concepts,
        'limit_up_count': [c[1] for c in concept_counts],
        'concept_moneys': [concept_moneys[c] for c in concepts]
    }
    return jsonify(result)


@api_blueprint.route('/predict_stock_price/<code>/<look_back>/<test_ratio>/<train_epochs>')
def predict_stock_price(code, look_back, test_ratio, train_epochs):
    """股票价格预测"""
    prices_df = em_spider.get_stock_kline_factor_datas(security_code=code, period='day', market_type=None)
    prices_df = prices_df.sort_values(by='date', ascending=True)
    print(prices_df.head())

    test_count = int(float(test_ratio) * prices_df.shape[0])

    train = prices_df['close'].values.tolist()[:-test_count]
    test = prices_df['close'].values.tolist()[-test_count:]

    def create_dataset(prehistory, dataset, look_back):
        dataX = []
        dataY = []

        history = prehistory
        for i in range(len(dataset)):
            x = history[i:(i + look_back)]
            y = dataset[i]
            dataX.append(x)
            dataY.append(y)
            history.append(y)
        return np.array(dataX), np.array(dataY)

    # 数据集构造
    look_back = int(look_back)
    trainX, trainY = create_dataset([train[0]] * look_back, train, look_back)
    testX, testY = create_dataset(train[-look_back:], test, look_back)

    print(trainX.shape, testX.shape)
    
    # 根据参数构建lstm模型
    def create_lstm_model():
        """
        单层 LSTM 神经网络
        """
        d = 0.2
        model = Sequential()
        model.add(LSTM(16, input_shape=(look_back, 1), return_sequences=False))
        model.add(Dropout(d))
        model.add(Dense(1, activation='relu'))
        model.compile(loss='mse', metrics=['mae'])
        return model

    model = create_lstm_model()

    train_epochs = int(train_epochs)
    model.fit(trainX, trainY, epochs=train_epochs, batch_size=4, verbose=1)

    # predict
    lstm_predictions = model.predict(testX)
    lstm_predictions = [float(r[0]) for r in lstm_predictions]
    lstm_error = mean_absolute_error(testY, lstm_predictions)
    print('Test MSE: %.3f' % lstm_error)
    lstm_predictions = train + lstm_predictions

    all_time = prices_df['date'].values.tolist()
    future_x = []
    pred_price = testY[-1]
    future_count = 10
    i = 0
    
    test_x = prices_df['close'].values.tolist()[-look_back:]
    test_x = np.array([test_x])
    
    print('test_x:', test_x)
    print('test_x:', test_x.shape)

    for future in range(future_count):
        i += 1
        # ratio = random.random() / 100 if random.random() > 0.5 else -random.random() / 100
        # pred_price *= (1 + ratio)
        pred_price = model.predict(test_x)[0][0]
        pred_price = float(pred_price)
        
        test_x = test_x[0][1:]
        test_x = np.append(test_x, pred_price)
        test_x = np.array([test_x])
        print('test_x:', test_x)

        future_x.append(pred_price)
        all_time.append(f'未来{i}个交易日')
    # print(future_x)

    all_data = prices_df['close'].values.tolist()
    all_data += [None] * 5
    lstm_predictions = lstm_predictions + future_x
    return jsonify({'all_time': all_time,
                    'all_data': all_data,
                    'add_predict': lstm_predictions,
                    'test_count': future_count,
                    'error': lstm_error})

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值