服装网站推广策划书,成品网站seo,北京住房和城乡建设网,成都市建网站公司Stock-Trading StockTrading AI小模型股票自动交易系统 项目文档 Stock-Trading 语雀
项目展示 功能介绍 对接证券平台#xff0c;实现股票自动化交易使用QuartZ定时任务调度#xff0c;每日自动更新数据使用DL4J框架实现LSTM模型指导股票买入#xff0c;采用T1短线交易策…Stock-Trading StockTrading AI小模型股票自动交易系统 项目文档 Stock-Trading · 语雀
项目展示 功能介绍 对接证券平台实现股票自动化交易使用QuartZ定时任务调度每日自动更新数据使用DL4J框架实现LSTM模型指导股票买入采用T1短线交易策略利用K8SGithubAction实现DevOps
后期优化方向 获得更多股票历史数据用于训练模型超参数调优实现增量训练DL4J代码框架优化
项目简介Stock-Trading是一款股票自动交易管理系统根据人工智能算法模型预测价格来自动买入卖出以获得收益后台项目地址https://github.com/mwangli/stock-trading前端项目地址https://github.com/mwangli/stock-front页面展示地址http://124.220.36.95/user/login 项目背景项目设计原则最小化设计原则在满足业务需求的情况下尽可能地以最简单的方式实现来减轻项目的复杂度节约服务器资源尽可能的使得项目 精致小巧技术是为业务服务的技术是手段而非目标脱离了业务技术将一文不值工作时间越长越能体会这句话的含义学习目的除外本项目是一个面向业务的项目区别于传统的toB, toC项目是一个toP(To Person)面向个人的项目业务背景理论从T1短线交易的角度来看股票收益是由买入和卖出时的价格来决定只要卖出时的价格比买入高(不考虑手续费)就能获得正向收益。将某一支股票的交易看做是一个猜大小或者抛硬币猜正反的数字游戏来看待只要猜对了就赢猜错了就输依据概率论假如能提高股票猜涨跌的准确率那么就会收益就会越高使用深度学习算法LSTM长短期记忆人工神经网络就是为了提猜涨跌的准确率能根据历史价格走势来预测明天的价格是涨还是跌选择理论涨幅较高的股买入该项目的的核心出发点是用机器学习算法来代替人的决策来进行股市交易算法能有效避免人性的弱点比如永远想等到更高价格再买结果崩盘而机器学习算法决策不会。股票市场的价格是由买卖市场决定的而买卖是由人来进行的因为人性是共通的所以价格波动是有规律的机器学习算法的目的就是为了学习这些规律来做出判断将参与股票交易看做一场猜大小博弈参与博弈的双方是自我和其他所有参与股票交易的人只要我猜对了我便盈利盈利的来源便是对方的亏损至于是谁亏我并不关心如果我猜错了那么我就亏显然是对方盈利至于是谁赚了也不重要上面理论的前提是从T1短线交易的角度出发针对某一天来看对比前一天总是有股票在涨也总会有股票在跌只要猜对了就能盈利如果从长期角度来看股票价格会受到国家政策经济形势实时新闻等多方面的总和因素影响这个输入足够庞杂如果机器学习算法需要学习到里面的规律并做出准确的判断穷尽整个人类现有的计算资源也未必能做到运行环境jdk1.8不建议使用9及其以上以为DL4J框架大概率会用到plot画图会依赖JFrame等高版本被删除的工具centos7.6腾讯云服务器2核4G部署了一套单节点的完整K8S集群以供学习测试部署过程参考redis, mysql, mongdb用于进行数据持久化技术框架前端React, AntDesignPro, Umi等后端Springboot, Mybatis-plus, QuartZ, WebSocket等模型DL4Jjava环境下的深度学习算法支持库部署方式java -jar 命令后台启动docker Jenkins流水线部署k8s devOps自动部署功能说明对接证券平台实现真实的股票自动化交易使用QuartZ定时任务调度每日自动执行交易流程使用DL4J框架实现LSTM模型指导股票买入采用T1短线交易策略包含简单认证授权功能利用K8SGithubAction实现CICDDevOps利用WebSocket实现后台日志实时推送前端集成用户登录数据分析任务调度日志查询等功能目录说明 模型部分包含LSTM模型训练和预测的相关代码工作流部分负责调度每天的任务来实现买入卖出逻辑Web部分包含SpringBoot Web项目的常见项目结构业务说明采用工作流驱动每个流程按照时间线互相独立执行有自己的输入输出工作流之间解耦合为什么采用这种设计在早期的版本中将所有的业务流程写在一个方法中按照时间线顺序执行下一个流程依赖上一个流程的输出或者结果比如买入需要先卖出否则没有可用资金买入之前还需更新实时价格计算评分等等这写流程执行的过程中如果前面的流程执行出错或者没有产生对应的输出就会导致后面的流程也出错为了保证程序的健壮性嵌套了大量IF-ELSE的逻辑判断核心流程方法代码长达一千二百行代码的可读性非常差设计不够简洁优雅采用工作流模式的目的是为了将这些相对独立的流程解耦合哪怕前面的流程出错对后面的流程影响也不大因为每个流程的输入输出已经进行了持久化。例如今天的价格预测任务执行失败了评分数据更新不及时仍然可以使用上次预测的评分来执行买入工作流虽然不准但是不会出错将这些独立的工作流按照合理的时间线组织起来就能完成每天的业务流程正常运转且程序不会出错导致异常崩溃任务执行时序图 实时价格同步任务
股票卖出任务
模型预测任务
股票买入任务
订单同步任务
历史价格同步任务
模型训练任务
MySQL
Mongo
MySQL
Mongo
磁盘
MySQL
MySQL
股票信息同步任务
数据清理任务
数据初始化任务
每日执行任务
周期执行任务
MySQL
MySQL
Mongo
9:30
12:00
13:30
13:00
15:30
全局一次
每周六一次
每月一次
权限刷新任务
每三天一次
每半月一次
股市交易时间段为90:30-11:30 13:00-15:00
9:00
MySQL
每日执行任务实时价格同步任务每个交易日早上执行同步所有股票最新的价格更新到Redis股票卖出任务每个上午交易时间段执行卖出完毕后将交易记录和交易订单写入到MySQL历史价格同步任务每个交易日的中午执行将所有股票今天最新的开盘收盘价写入Mongo模型预测任务每个交易日的中午执行预测明天的开盘收盘价格。将数据写入MySQL股票买入任务每个交易日的下午执行买入成功后将交易记录和订单记录写入MySQL同步订单任务每个交易日的晚上执行将今天产生的成交订单同步到MySQL周期执行任务股票信息同步任务每三天同步一次补充新上市的股票和标记已经退市的股票模型训练任务每周的非交易日(周六周日)执行将本周最新产生的数量与历史数据叠加用于模型的增量迭代训练训练完成后将模型保存到磁盘权限刷新任务更新每支股票的交易权限每半年一次数据清理任务每个月执行一次请里系统运行产生的无用数据和过量历史数据数据初始化任务项目初始化或者历史价格数据丢失的时候执行只需全局执行一次问题说明技术选型问题为什么使用DL4J而不是Tensorflow或PyTorch来做深度学习模型实现这是一个面向业务的项目使用Java的深度学习框架能够更好的与业务集成对于开发者来说使用一门熟悉的语言来能更快的实现业务如果是初学者没有语言负担的话建议使用PythonTensorflow更加简单易上手为什么使用QuartZ而不是xxlJob或者SpringSchedule根据项目需求以及最小化设计原则Schedule不能满足动态修改执行时间和主动触发的需求而分布式调度显然又太重了这个项目不需要用到分布式单节点就足够了而使用分布式调度的话会引来新的分布式调度同步问题增加了系统的复杂度违背项目设计原则为什么不使用mini-cube或者docker根据最小化设计原则确实应该使用docker或者jar包来运行但这是出于学习的目的因为我工作所接触的项目都是K8S的微服务项目所以我自己部署一套单节点的K8S集群以供我学习实验或者跑一些自己的项目为什么不使用SecurityJWT来做认证授权基于最小化设计原则我的目标用户是个人及访客基于Web拦截器就可以实现项目中甚至不包含用户表目前只有admin, guest, test三个用户如果是出于学习或者做toB项目使用Shiro/SecurityRBAC是更常见的做法如何对接其他证券平台或者其他模型预测算法在Job模块目录下预留了一个IDataService接口只要实现该接口能提供对应平台的数据model模块下也预留了个IModelService接口使用其他算法模型实现该接口利用Java多态和Spring注入功能即可无缝对接业务策略问题为什么采用T1短线交易策略而不是TN在改项目的2.0版本中我采用的是TN的交易模式即今天买入等到合适的时间点卖出但是实际的交易结果并不理想10000元本金运行不到1个月亏损约为1200元持股时间长的基本亏损较多可以在交易记录中查到因为股票市场本身是T1周期的而LSTM模型由于神经网络本身的特点在TN周期上的预测并不理想只能采用T1的预测模式。而这跟股市的T1周期本身是冲突的所以拆成了两个T0.5的模式来完成每日买卖的业务流运转到底应该采用大模型还是小模型尝试过针对每只股票训练独有的小模型来进行预测但是模型的测试结果并不理想因为针对单只股票可供训练的历史数据太少了通过平台接口获取到的历史数据只有500条这对人工神经网络的训练来说太少了不足以让机器学到样本数据特征于是放弃了独有模型训练统一模型用4000支股票每支500条每天4个价格共8,000,000数据量来进行模型训练有没有资金风险或者账号泄露安全问题(待优化)本项目的出发点是用机器和算法来代替人执行买卖动作需要用到个人资金账号需要在Redis导入资金账号和加密后密码执行登录后的逻辑所以会有账号泄露的风险但是不会有资金风险就算账号泄露资金提现也只能提现到该账户对应实名银行卡下为什么是采用每天的上午开盘收盘价来实现预测输入输出维度是2-2?参阅过很多LSTM模型股票预测模型的代码主流方式大致相同有以下三种方案用每天的开盘价收盘价最高价最低价4条样本特征来预测明天的4个价格输入输出维度为4-4用每天的开盘价收盘价最高价最低价4条样本特征来预测明天的1个价格输入输出维度为4-1用每天的开盘价收盘价最高价最低价1条样本特征来预测明天的1个价格输入输出维度为1-1因为我是对明天卖出价格进行预测来指导今天的股票买入如果采用4-4或者4-1的预测方案则需等到当天的4个数据全部产生才能进行预测此时已经过了当天的交易时间段所有只能等第二天才能买入股票买入后又要等一天才能卖出所以实际交易时间段为T2失去了LSTM价格预测的准确性尝试过采用1-1方式进行预测在测试集上表现的结果并不理想故此采用2-2的输入输出预测模型