ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Django+LLM大模型股票行情预测系统实战:从数据处理到量化策略

Django+LLM大模型股票行情预测系统实战:从数据处理到量化策略 毕业设计做到股票预测这个方向的同学十有八九都经历过同样的纠结传统的时间序列模型写出来没什么亮点纯深度学习又容易被评委问“你的创新点在哪”。我当初选的是DjangoLLM大模型股票行情预测系统这个组合核心思路是让大模型来做两件事——一是生成量化交易策略的信号解释二是用自然语言把预测结果讲成人话。整套系统兼顾了大数据处理、量化交易策略、Web全栈开发和前沿的大模型应用作为计算机专业的毕业设计覆盖面够广技术深度也有地方可挖。这篇文章把我在实际搭建这套系统时踩过的坑、验证过的方案、以及关键代码逻辑都整理出来不是那种贴几个概念图就完事的模板文而是真正能让你从零搭出一套可演示系统的实操记录。无论是想照着自己复现还是打算在这个方向上做二次开发都值得花几分钟认真看看。1. 项目整体设计与技术选型思路1.1 为什么选Django做Web框架后台管理、数据库模型、用户认证这些功能是毕设答辩时评委一定会关注的功能完整性指标。Django自带的后台管理界面做得非常完善我几乎没有额外写任何管理前端代码就直接拿到了一个可以管理用户、股票池、预测记录的后台。对于需要快速验证业务逻辑、同时要体现工程规范性的毕业设计来说Django的“全家桶”模式远比Flask这种微框架更省心。另一个关键点是Django的ORM。股票数据需要频繁按日期、股票代码做时间序列查询Django ORM对这类查询的支持很成熟配合数据库索引能拿到不错的性能。加上Django的模板系统和REST Framework前后端分离或者不分离都可以灵活选择这一点在后期调整展示方案时帮了我大忙。1.2 LLM在系统里的定位LLM大模型在整个系统里不是用来预测股价涨跌的——一开始我也试过直接让大模型预测价格效果非常不靠谱这个后面详细说。最终敲定的定位是让LLM做三件事第一对量化策略产生的交易信号生成自然语言解读。比如策略在某个交易日发出了买入信号大模型会根据当天的市场环境、技术指标状态、持仓情况生成一段类似分析师口吻的解释告诉用户“为什么会有这个信号”。第二对预测结果做可视化前的数据总结。模型预测输出的是价格序列普通用户看着一串数字没有概念LLM可以把关键变化点提炼成简报。第三提供一个对话交互入口。用户可以在系统里直接问“最近一个月沪深300的走势风险如何”系统会结合数据库里的最新行情数据、指标计算结果和预测结果让LLM生成回答。这三件事都避开了让LLM去做数值预测的深坑又充分体现了大模型在自然语言处理和知识整合上的优势在毕业设计里属于性价比极高的组合方式。1.3 整体技术架构整个系统的分层结构是这样的数据层使用akshare和tushare获取行情数据存储到MySQL按日线和分钟线两种粒度建表服务层包括数据清洗模块、技术指标计算模块TA-Lib、策略引擎、预测模型调度模块分析层传统时间序列模型LSTM、Prophet 量化策略MA双均线、RSI超卖、MACD金叉死叉等基础策略LLM层通过API调用大模型服务包括信号解释、数据总结、对话问答三个功能模块展示层Django模板ECharts可视化包含仪表盘、个股详情、策略回测报告、对话界面这套架构的特点是每一层之间的耦合度都控制得比较好比如把tushare换成baostock只需要改数据层把LLM接口从某个厂商换成另一个只需要改LLM层的封装。毕设答辩时很加分的一点是你可以把这种低耦合设计作为系统亮点讲出来。2. 核心功能模块与实现要点2.1 数据采集与预处理股票数据是整个系统的燃料数据质量决定了后续所有分析的可信度。我当时用的是akshare免费且不需要注册token对毕设场景非常友好。不过它有个问题——数据接口偶尔会变动今天能跑的代码过两周可能就报错所以一定要在数据采集模块外面做一层异常捕获和重试机制。采集逻辑上建议先把股票基础列表存下来包括股票代码、名称、所属板块然后再按天增量拉取日K线数据。K线数据至少要包含开高低收、成交量、成交额、换手率这几个核心字段。考虑到数据量增长和回测需求我在daily_k线表上建了(ts_code, trade_date)的联合索引这样按股票查时间序列时会快很多。数据预处理有几点值得注意复权处理如果用前复权数据做回测建议在数据落地时就一次性处理好不要每算一遍策略就重算一次停牌处理停牌日没有交易数据需要做向前填充避免时间序列出现断点异常值过滤单日涨跌幅超过20%的数据点新股上市或极端行情需要标记避免污染训练集训练集/测试集切分按时间顺序切不能随机切这是时间序列项目和普通机器学习项目最大的区别2.2 技术指标计算技术指标我统一用TA-Lib计算这个库的优点是计算速度快、结果和主流行情软件一致。毕设里不推荐自己手写指标公式一来是容易出错二来是评委如果拿同花顺或东方财富的指标数值来对比数值对不上的话会显得不够严谨。常用的指标组合我整理成了这样一个配置趋势类MA5、MA10、MA20、MA60、MACDDIF、DEA、HIST摆动类RSI6、12、24、KDJK、D、J、BIAS量能类VOL、OBV、量比波动类BOLL上中下轨、ATR指标计算完成后需要统一做标准化处理再输入预测模型。我用的是z-score标准化但要特别注意标准化的均值和标准差必须只用训练集的数据计算然后用同样的参数去转换测试集否则会引入未来信息造成数据泄漏让回测结果虚高。2.3 量化交易策略引擎策略引擎是整个系统的规则核心。我给系统实现了三类基础策略覆盖了技术分析里最常用的逻辑MA双均线策略的逻辑是金叉买入、死叉卖出简单而且可视化效果好。回测结果在震荡行情里会有较多无效交易实盘中会被手续费磨损这个要在系统里把手续费率设成双边万三相对真实一些。RSI超卖回归策略的逻辑是RSI低于阈值买入、高于阈值卖出适合震荡市。这个策略的缺点是单边上涨行情里会过早止盈丢了后面的利润空间。MACD金叉死叉策略是在金叉买入、死叉卖出基础上叠加了DIF与股价的背离判断作为过滤条件相比纯双均线会减少一部分假信号。策略引擎我抽象了一个BaseStrategy接口每个策略继承接口实现generate_signal方法返回哪天买入、哪天卖出、当前持仓状态这些信息。这样做的好处是后续扩展新策略的时候不需要改动其他模块的代码直接在策略注册表里加一项就行。2.4 预测模型模块预测模型用了两种思路做对比——LSTM和Prophet。LSTM属于深度学习模型能够捕捉时间序列的非线性特征Prophet是Facebook开源的加性模型对趋势和季节性有比较强的解释性。两者结合可以让毕业设计有一个模型对比的实验环节。LSTM部分我用的是PyTorch实现输入特征选择了过去20个交易日的收盘价、成交量、RSI、MACD这几列经过归一化后喂给一个两层的LSTM网络隐藏层维度设为64输出预测的下一交易日收盘价。训练集用前70%的数据验证集用后30%。这里有一个关键的小细节预测结果一定要做反归一化并且把预测值和真实值放在同一个坐标系里去画对比图。我在开发时遇到过忘记做反归一化导致预测值全部归一数值、跟真实价格差了三个数量级的情况。这种极端数值错误在答辩演示时会特别尴尬务必检查。Prophet模型的输入只需要ds和y两列使用起来比较简单。不过股票价格序列里的节假日效应和突发性事件Prophet处理得并不好。而且它的预测区间在长期预测时会快速发散所以我的系统里Prophet主要用于短期趋势判断不直接输出明确的交易信号。2.5 LLM大模型集成方案LLM集成是整个系统里最有亮点、也是最容易失控的部分。我用的是调用大模型API的方式具体选哪家可以根据自己的预算和可用性决定。LLM层的封装我做了一个统一接口核心是设计好prompt模板。以策略信号解释为例模板是你是一名专业的量化交易分析师。根据以下信息用通俗易懂的语言解释今天的交易信号 股票名称{stock_name} 股票代码{stock_code} 交易日期{date} 策略名称{strategy_name} 触发信号{signal} 当前技术指标{indicators_text} 最近5日行情摘要{recent_market_text} 请从以下角度输出分析 1. 信号触发的原因 2. 当前市场环境的简要判断 3. 可能的风险点 4. 后续需要关注的关键价位或指标变化注意我在prompt里传的是行情摘要和指标文本不是把原始行情数据全部丢给大模型。大模型对超长文本的处理能力有限而且信息太杂乱会降低输出的稳定性。先让程序从数据库里把关键指标取出来格式化成文本再拼接到prompt里效果要稳定得多。这里面还有个安全细节调用大模型API的密钥绝不能硬编码在前端代码里也不能提交到Git仓库。我是把密钥放在环境变量里加载同时用一个独立的配置文件管理这个文件通过.gitignore排除在版本控制之外。一旦密钥泄漏别人就能拿着你的key无限调用产生费用。这类鉴权信息管理的问题在毕设文档里可以作为一个安全意识亮点写进去。2.6 系统核心页面设计系统页面我做了五个主要界面仪表盘页面展示三大板块包括主要指数和自选股的当日行情快照、系统最新的预测信号、以及策略运行状态概览。自选股支持手动添加数据上做了缓存不会每次打开页面都重新拉取行情。个股详情页是核心展示页面有四张图K线图叠加MA均线、成交量柱状图、MACD指标图、预测价格对比图。四张图联动鼠标悬浮显示同一日期的所有数据用ECharts实现。这里值得提一下ECharts在数据更新时需要用setOption而不是重新初始化实例否则图表会闪烁且交互状态会丢失。策略回测页展示策略净值曲线、基准指数净值曲线、最大回撤、夏普比率、胜率、交易次数等指标。回测看板对评委直观理解量化交易很重要如果回测收益曲线跑赢基准整个项目的说服力会大幅提升。预测结果页展示模型对未来N个交易日的价格预测并生成配套的LLM解读文案。这个页面是LLM能力的直接展示区也是答辩时的加分点。对话分析页提供一个输入框可以输入自然语言问题例如“当前持仓的风险如何”系统结合实时数据和指标生成回答。这里要注意大模型的回答内容应当基于系统提供的数据防止它“自由发挥”编造行情数据所以我在prompt中强制要求“只能基于给定的数据回答不得编造行情数字”。3. 实操过程与核心环节实现3.1 环境准备与项目初始化先列一下我用的环境版本方便你复现时对齐Python 3.10Django 4.2PyTorch 2.0TA-Lib 0.4.28MySQL 8.0Redis用于缓存行情数据和LLM调用结果Python依赖建议用虚拟环境管理不要直接装在系统Python里。我习惯在项目根目录下执行python -m venv venv source venv/bin/activate # Windows上用 venv\Scripts\activate pip install django djangorestframework pymysql torch ta-lib akshare prophet openai celeryDjango项目初始化可以用以下几个命令django-admin startproject stock_system cd stock_system python manage.py startapp stocks python manage.py startapp strategies python manage.py startapp prediction python manage.py startapp llm_chat我按业务域拆分了四个子应用stocks管数据strategies管策略prediction管预测llm_chat管大模型交互。每个应用各司其职命名清晰评阅老师在阅读代码时会比较容易上手。3.2 数据库模型设计核心表结构我梳理了这样几张表StockInfo表存股票基础信息字段包括ts_code、symbol、name、area、industry、market、list_date。这里ts_code我用的是类似600000.SH的格式方便和多个数据源对齐。DailyK线表是每日行情数据字段包括ts_code、trade_date、open、high、low、close、pre_close、change、pct_chg、vol、amount。这张表的数据量最大务必在ts_code和trade_date上建立联合唯一索引同时加上普通索引供日期范围查询。StrategyConfig表存策略参数配置字段包括strategy_name、params_json、description、is_active。策略参数通过JSON字段存储的好处是扩展新策略时不需要频繁改表结构Django的JSONField直接映射MySQL的JSON类型。SignalRecord表存策略产生的交易信号每次策略引擎跑出买卖信号都会写入一条记录并关联当天的行情快照。PredictionRecord表存预测结果包括模型名称、预测日期、预测价格、置信区间、生成时间。一次预测可能生成未来5日或10日的结果所以预测值用JSON字段保存一条序列。LLMChatRecord表存对话记录包括用户问题、系统回答、相关的股票池和上下文摘要。3.3 数据采集任务实现行情数据采集用Celery的定时任务驱动。每天早上开盘前定时拉取前一交易日数据收盘后再拉一次当日数据做校对。核心拉取代码逻辑大致是这样# tasks.py from celery import shared_task import akshare as ak shared_task def fetch_daily_kline(ts_code: str): # 这里用akshare的stock_zh_a_hist接口 df ak.stock_zh_a_hist( symbolts_code.split(.)[0], perioddaily, start_date20200101, end_date20241231, adjustqfq ) # 字段名映射akshare返回中文列名转成系统的英文字段 df df.rename(columns{ 日期: trade_date, 开盘: open, 收盘: close, 最高: high, 最低: low, 成交量: vol, 成交额: amount, 涨跌幅: pct_chg, }) # 批量写入数据库用upsert避免重复 from django.db import transaction with transaction.atomic(): for _, row in df.iterrows(): obj, created DailyKLine.objects.update_or_create( ts_codets_code, trade_daterow[trade_date], defaults{ open: row[open], high: row[high], low: row[low], close: row[close], vol: row[vol], amount: row[amount], pct_chg: row[pct_chg], } )这里的update_or_create很方便即使网络中断导致部分数据缺失下次重跑也能补齐不会产生重复记录。批量写入时逐行调用ORM会有点慢但毕设场景的数据量完全能接受。如果以后要处理全市场5000多只股票建议改成bulk_create配合ON DUPLICATE KEY UPDATE。3.4 技术指标计算与特征工程拿到的原始K线只有最基础的行情字段量化策略和预测模型都需要基于衍生指标才能工作。我单独写了一个feature_engine模块输入是一个股票的DataFrame输出是加好各类指标列的DataFrameimport talib as ta import numpy as np import pandas as pd def calculate_features(df: pd.DataFrame) - pd.DataFrame: df df.sort_values(trade_date).reset_index(dropTrue) close df[close].values high df[high].values low df[low].values volume df[vol].values # 均线 df[ma5] ta.SMA(close, timeperiod5) df[ma10] ta.SMA(close, timeperiod10) df[ma20] ta.SMA(close, timeperiod20) df[ma60] ta.SMA(close, timeperiod60) # MACD df[dif], df[dea], df[hist] ta.MACD(close, fastperiod12, slowperiod26, signalperiod9) # RSI df[rsi6] ta.RSI(close, timeperiod6) df[rsi12] ta.RSI(close, timeperiod12) df[rsi24] ta.RSI(close, timeperiod24) # KDJ df[k], df[d] ta.STOCH(high, low, close, fastk_period9, slowk_period3, slowd_period3) df[j] 3 * df[k] - 2 * df[d] # BOLL df[boll_upper], df[boll_mid], df[boll_lower] ta.BBANDS(close, timeperiod20, nbdevup2, nbdevdn2) # ATR df[atr] ta.ATR(high, low, close, timeperiod14) # 量比成交量/过去5日均量 df[vol_ma5] ta.SMA(volume, timeperiod5) df[vol_ratio] volume / (df[vol_ma5] 1e-10) return df算完指标后需要做一次全表检查确认没有无穷值和极端缺失值。某些指标在数据前几行会出现NaN这些行在训练和回测时需要过滤掉或者用前向填充补齐。3.5 策略引擎与回测逻辑策略引擎我设计了两种运行模式信号模式和历史回测模式。信号模式是在每个交易日收盘后对当天最新的数据计算指标判断是否有买卖信号历史回测模式则是在历史K线上逐日复现信号模拟真实交易。回测核心逻辑需要一个撮合引擎记录资金、持仓、交易费用、每日净值def run_backtest(df_with_signals, initial_cash1000000, fee_rate0.0003): cash initial_cash position 0 equity_curve [] trades [] last_signal None for idx, row in df_with_signals.iterrows(): price row[close] signal row[signal] # buy / sell / None if signal buy and last_signal ! buy: # 全仓买入买入手续费 available_cash cash * (1 - fee_rate) position available_cash / price cash 0 last_signal buy trades.append({date: row[trade_date], type: buy, price: price, cash: cash position * price}) elif signal sell and position 0 and last_signal ! sell: # 全仓卖出卖出手续费 cash position * price * (1 - fee_rate) position 0 last_signal sell trades.append({date: row[trade_date], type: sell, price: price, cash: cash position * price}) equity cash position * price equity_curve.append({date: row[trade_date], equity: equity}) return equity_curve, trades回测后计算几个核心绩效指标年化收益率等于终点净值除以起点净值的年化增长最大回撤是净值曲线中从峰顶到后续最低点的最大跌幅可以用累计最高净值和当前净值差值除以前者得到夏普比率是日收益率均值减无风险利率后除以收益率标准差再乘以252的平方根做年化我的代码里用0.03作为年化无风险利率胜率只统计平仓交易盈利次数除以总平仓次数。这里必须提醒策略回测的结果很依赖参数设置。比如MA双均线策略如果把窗口设成5和10在A股某些年份可能收益很高换到另一段时间就严重回撤。所以系统里做了一次参数网格搜索分别试(5,20)、(10,30)、(5,60)等组合把回测结果最好的一组作为默认参数同时把完整参数对比表保存在系统里作为策略设计过程的佐证。3.6 LSTM预测模型实现LSTM模型的训练脚本独立放在一个train_lstm.py里面不随Django应用启动。我用PyTorch实现核心代码如下import torch import torch.nn as nn from torch.utils.data import DataLoader, TensorDataset class StockLSTM(nn.Module): def __init__(self, input_size5, hidden_size64, num_layers2, output_size1): super().__init__() self.lstm nn.LSTM(input_size, hidden_size, num_layers, batch_firstTrue, dropout0.2) self.fc nn.Linear(hidden_size, output_size) def forward(self, x): out, _ self.lstm(x) out self.fc(out[:, -1, :]) return out输入特征维度取5分别是标准化后的close、vol、rsi12、macd_hist和vol_ratio序列长度为20个交易日。batch_size用64学习率用0.001Adam优化器。损失函数用MSE。训练时我加了一个早停机制验证集loss连续10个epoch没有下降就终止训练并保存最优模型。这个机制能有效缓解过拟合尤其是在股票数据量不大、噪声又高的情况下。训练完成后的模型保存在models/目录下Django预测模块通过joblib或torch.load加载模型权重。要注意的是预测模块加载模型时的输入特征顺序必须和训练时完全一致建议把特征列名和标准化参数一起打包保存这样即使代码版本更新也不会出现特征顺序错乱的问题。3.7 Django与LLM集成实现LLM集成的核心模块是一个LLMService类内部封装了prompt管理、API调用和结果解析import os import json import requests class LLMService: def __init__(self): self.api_key os.environ.get(LLM_API_KEY) self.base_url os.environ.get(LLM_BASE_URL) self.model os.environ.get(LLM_MODEL, default-model) self.timeout 30 def chat(self, messages, temperature0.3): headers { Authorization: fBearer {self.api_key}, Content-Type: application/json } payload { model: self.model, messages: messages, temperature: temperature } try: resp requests.post(self.base_url, headersheaders, jsonpayload, timeoutself.timeout) resp.raise_for_status() data resp.json() return data[choices][0][message][content] except Exception as e: return fLLM服务调用异常{str(e)}, def explain_signal(self, signal_record): prompt build_signal_explain_prompt(signal_record) messages [ {role: system, content: 你是专业的量化交易分析师。}, {role: user, content: prompt} ] return self.chat(messages, temperature0.3)这个封装有几个好处环境变量集中管理密钥prompt和调用逻辑分离超时和异常处理统一管理。即使模型服务暂时不可用系统也能返回提示信息而不是直接崩溃。3.8 系统部署与稳定性优化本地开发环境用Django自带的runserver就够了但演示时如果出现崩溃体验会非常糟糕尤其是答辩现场。我做了一次面向演示的稳定化处理生产环境用waitress代替runserver。waitress是纯Python的WSGI服务器安装简单不需要额外配置Nginx对毕设场景足够。启动命令是waitress-serve --listen0.0.0.0:8000 stock_system.wsgi:application行情数据展示时前端和后端之间加了一层Redis缓存。同一个股票K线请求在10分钟内的多次访问直接走缓存避免每次刷新页面都去查询数据库或调用数据源接口。这一层缓存让页面响应速度明显提升演示时快速翻页不会出现卡顿。后端返回的JSON里避免返回NaN。JavaScript对NaN的序列化会解析成null导致前端图表显示异常。我在所有数据接口出口统一做了一次处理把NaN转成字符串null或直接过滤掉。4. 常见问题与排查技巧实录4.1 数据获取阶段akshare接口突然变化是头号问题。一周前还在用的列名可能因为上游数据源改版就消失了。我的应对方案是在数据采集函数里加了一层字段名校验如果预期的列不存在提前抛出有明确提示的异常并打印实际返回的列名列表方便快速定位。另外不要只依赖一个数据源我在系统里预留了tushare的备用实现虽然需要token但作为保底方案心里有底。复权数据坑也不少。如果是前复权数据最新价等于实际价格但是历史价格会被调整。回测时如果拿前复权数据算收益率没问题但如果拿它和未复权的当日涨幅做对比就会对不上。我最终统一采用前复权数据做策略计算在系统页面上对用户标注“价格已做前复权处理”。4.2 指标计算阶段TA-Lib在Windows上安装不顺利是一个经典问题。直接pip install talib通常会失败需要在PyPI上下载对应Python版本的whl文件安装。实际上仔细看一下报错日志一般都是缺少C编译环境或找不到库文件用预编译的whl文件装是最省心的路径。指标计算后出现大量NaN和inf也很常见尤其是数据刚刚上市、成交量极低或者长期停牌后复牌的股票。我的策略模块里加了统一的数据过滤函数计算指标后只保留从第一行同时拥有全部指标值开始的数据后续所有策略和预测都基于这段连续数据避免NaN污染。4.3 模型训练与预测问题LSTM预测结果时好时坏这是一个必须正视的事实。单独拿LSTM做预测在训练集上前期的拟合效果可能不错但一到未来数据就容易失效。我的系统里特意没有把LSTM的预测结果直接当交易信号而是作为“趋势参考”信号触发还是依靠可解释的量化策略规则。这在学术上叫“预测与决策分离”是一个非常值得在毕业论文里展开讨论的设计思路。还有一个细节问题是训练集和测试集切分时的数据泄漏。有些同学习惯把整个数据集标准化后再切分这样测试集的信息已经参与了标准化参数的计算回测结果会偏乐观。我改用只基于训练集计算均值和标准差再用训练集参数去标准化测试集代码上多几行但结果可信度提升很大。4.4 LLM集成问题大模型返回内容不稳定是最常见的问题。同样的prompt有时候输出一行结论有时候输出一大段分析而且偶尔会把历史数据中的数字说错。我的解决办法是设置temperature低一点控制在0.2到0.3之间同时在prompt里明确要求“请基于给定的数据回答不要输出数据中不存在的信息”。输出之后还用一个解析函数检查关键数字格式是否合理比如金额是否为正、日期格式是否正确。密钥管理问题我在前面提过必须放在环境变量里。Django的settings.py可以直接通过os.environ读取。另外不要把密钥提交到Git仓库我甚至建议把.env文件加入白名单检查防止某次提交时不小心带上去。4.5 前端展示问题ECharts在数据更新时出现闪烁和重绘是个常见体验问题。原因是每次刷新页面都用chart.init重新初始化实例正确的做法是首次用init之后更新数据用setOption这样动画过渡和交互状态都能保留。前后端数据交互时日期格式不统一也踩过坑。Python的datetime序列化成JSON后是YYYY-MM-DD格式但有时带有时区后缀ECharts的坐标轴类型如果设置成time对这两种格式的兼容性不一样。我最后统一在后端序列化时格式化为字符串YYYY-MM-DD前端坐标轴类型设置为category彻底解决日期错位的问题。4.6 性能问题股票数据量上来后页面首次加载会变得很慢。一开始我的列表页直接查出全表数据然后一股脑全部序列化成JSON返回首屏加载要好几秒。后来加了分页和日期范围参数默认只返回最近一年的数据同时用Redis缓存热点查询页面加载速度降到1秒以内。LLM调用耗时也是个隐患一次完整对话可能耗时几秒甚至十几秒。我在前端做了动画加载提示后端用异步任务处理对话请求。Django自带的异步支持还不太成熟我用了Celery把LLM调用放到后台任务去执行前端轮询结果。这个改造让用户体验好了很多否则用户点击对话后页面一直转圈会误以为系统崩溃。5. 手动实操上手指南5.1 在本地完整跑通系统如果你拿到一套完整的源码包建议按照下面的顺序从零开始跑通第一步准备基础环境。安装Python 3.10和MySQL创建虚拟环境并安装requirements.txt。依赖安装完成后先执行python manage.py migrate初始化数据库表结构。第二步准备数据。修改config.py中的数据源配置和数据库连接信息。先跑一次数据采集脚本建议只采1到2只股票最近半年的日K线比如平安银行或贵州茅台日K线接口稳定且数据质量高。这一步能让你快速验证数据链路是否正常不需要一开始就全市场采集。第三步运行策略回测。登入Django后台创建一条策略配置选择MA双均线策略然后手动触发一次该股票的回测任务。回测完成后页面上能看到净值曲线和绩效指标。第四步先离线训练好LSTM模型。运行train_lstm.py脚本把模型权重保存到models目录下。然后执行预测脚本生成未来5日的预测值并保存到预测表中。第五步配置并调用LLM服务。在环境变量中填入API密钥然后进入对话页面输入一个问题验证LLM服务能正常返回。如果暂时没有大模型的API可以把LLM模块做成mock模式返回预设的回复模板确保正常演示流程不中断。第六步启动waitress用浏览器访问系统。依次检查仪表盘、个股详情、策略回测、预测结果、对话页面是否能正常展示。5.2 演示前一定要做的几件事答辩演示前我强烈建议准备一套完整的演示脚本并提前手动运行一遍所有功能而不是在现场临时操作数据采集。万一现场网络不稳定或者数据源接口波动数据拉不出来整个演示就会卡住。演示数据建议提前准备好把要展示的几只股票数据全部预拉到本地MySQL中并且关闭自动数据更新任务。这样演示过程完全离线可控不受外部环境影响。LLM模块准备一个备用方案。如果现场调用大模型API失败画面会很尴尬。我在系统里做了一个本地mock开关当LLM_API_KEY没有配置或调用失败时自动返回高质量的预置分析模板保证演示流程不断档。在答辩演示LSTM预测时要坦白说明预测模型的局限性和未来改进方向。评委听到“模型在历史回测上表现良好但实际预测准确率受市场环境影响较大未来可以引入Attention机制或更多宏观特征”这类表述通常会对你的系统理解和思考深度有好的印象。6. 关于系统扩展与后续优化的思考做完这套系统自己实际体会最深的一点是把大模型引入量化分析时不要执着于让大模型去预测股价它的优势在于语义理解和知识组织而不是数值外推。真正合理的架构是让传统量化模型负责计算和信号生成让大模型负责解释、总结和人机交互各做各擅长的事。后续还有几个方向上值得继续挖掘。在预测模型层面可以把LSTM升级成Transformer甚至引入注意力机制或者在多股票之间做联动预测结合行业板块指数。在策略层面可以加入风险控制模块比如设置动态止盈止损、按ATR比例控制仓位。在LLM应用层面可以做RAG增强让大模型能够检索历史新闻、公告和研报片段作为回答背景也可以让LLM输出结构化JSON格式的多因子策略参数实现简单的自动策略生成效果。如果你是在这个毕设方向上起步希望这篇实战记录能帮你少踩一些坑。尤其是数据泄漏、复权处理、LLM定位这几个关键决策想清楚再动手会比盲目堆功能顺利得多。
返回列表