FinRL 深度强化学习股票交易完整指南5 种 DRL 算法从 OHLCV 行情到样本外回测【免费下载链接】FinRLFinRL®: Financial Reinforcement Learning. 项目地址: https://gitcode.com/gh_mirrors/fi/FinRL-LibraryFinRL 是一个金融强化学习框架它把历史行情封装成 Gym 风格的市场环境让深度强化学习DRL智能体在历史数据上训练股票交易策略训练完再拿样本外数据检验。官方 First Glance 章节推荐用 Stock_NeurIPS2018 系列三个 notebook 作为入门路径——读完本文你会清楚一条行情如何变成状态向量、环境如何撮合交易、五种算法各该怎么训以及如何与经典基线对比出可辩护的回测结论。 为什么金融需要 DRL状态、动作、奖励三问规则式策略的天花板很明显30 只股票、8 个技术指标的 if/else 组合写不完指标之间怎么加权也没有依据。交易本质是在不确定性下连续做决策这正是 DRL 擅长的事——智能体不需要规则库只需要在历史数据上不断试错并获得反馈。类比学车你记不住每一个路况只能靠看路 → 打方向 → 收到反馈的循环练出来。FinRL 的整条流水线可以拆成三问后文每个模块都在回答其中之一状态 s智能体此刻看到什么FinRL 中是现金、各股价格、当前持仓与技术指标拼成的向量动作 a它能做什么每只股票一个数正数买入、负数卖出、0 持有奖励 r这一步做得好不好FinRL 取本步后组合总资产 − 之前总资产。官方建议从 finrl/applications/Stock_NeurIPS2018/ 的数据、训练、回测三个 notebook 走完全流程实验基于 NeurIPS 2018 论文Practical deep reinforcement learning approach for stock trading。本文用同一套数据逐层拆解。 数据层如何把 OHLCV 行情加工成状态向量如何拉取 OHLCV 行情OHLCV 即 Open、High、Low、Close、Volume一个交易日五个数几乎覆盖趋势分析所需的全部数值信息。FinRL 把yfinance封装成YahooDownloader统一列名并把复权收盘价折算进各价格列。演示用的股票池是 finrl/config_tickers.py 里的DOW_30_TICKER道琼斯工业平均指数成分股训练期取 2009-01-01 至 2020-07-01交易期样本外取 2020-07-01 至 2021-10-29df_raw YahooDownloader( start_date2009-01-01, end_date2021-10-29, ticker_listconfig_tickers.DOW_30_TICKER ).fetch_data() fe FeatureEngineer(use_technical_indicatorTrue, tech_indicator_listINDICATORS, use_vixTrue, use_turbulenceTrue) processed fe.preprocess_data(df_raw)FeatureEngineer.preprocess_data的实现见 preprocessors.py依次做三件事用stockstats算技术指标、下载 VIXCBOE 波动率指数市场恐慌的标尺按日期并入、追加 turbulence 指数。INDICATORS在 finrl/config.py 中默认含macd、boll_ub、boll_lb、rsi_30、cci_30、dx_30、close_30_sma、close_60_sma共 8 个指标。状态空间维度怎么算turbulence 指数回答市场是否危机用 252 个交易日的滚动窗口算收益率协方差矩阵再度量当天收益偏离历史均值的程度——本质是马氏距离式度量数值越大波动越极端。2008 年式崩盘中它会显著飙升为后面的环境风控提供信号。对齐缺失数据并拆出两份数据集不同股票上市日期不同个别日子还有停牌。notebook 先用itertools.product构造 (date, ticker) 全组合、左连接真实数据、缺失补 0再用data_split按日期拆段半开区间start date endtrain data_split(processed_full, 2009-01-01, 2020-07-01) trade data_split(processed_full, 2020-07-01, 2021-10-29) train.to_csv(train_data.csv) trade.to_csv(trade_data.csv)train_data.csv给训练用trade_data.csv留给样本外评估。两者绝不能混用否则回测数字全是自欺。⚙️ 环境层StockTradingEnv 把市场变成可交互对象关键参数各是什么意思数据只是表格要让智能体操作它必须包成 Gym 环境。StockTradingEnv 就是本系列的市场模拟器参数本系列取值含义hmax100单只股票单步最多买卖的股数initial_amount1,000,000初始现金num_stock_shares[0] * 股票数各股初始持仓全空仓buy_cost_pct/sell_cost_pct各 0.001买入/卖出手续费比例action_space股票数动作维度每股一个连续值state_space公式算出观测向量维度reward_scaling1e-4奖励缩放系数稳定训练e_train_gym StockTradingEnv(dftrain, hmax100, initial_amount1_000_000, num_stock_shares[0] * stock_dimension, buy_cost_pct[0.001] * stock_dimension, sell_cost_pct[0.001] * stock_dimension, state_spacestate_space, stock_dimstock_dimension, tech_indicator_listINDICATORS, action_spacestock_dimension, reward_scaling1e-4) env_train, _ e_train_gym.get_sb_env()get_sb_env()把环境包装成 Stable-Baselines3SB3PyTorch 实现的常用 DRL 算法库要求的DummyVecEnv格式。状态怎么拼、撮合怎么算状态拼装顺序固定见_initiate_state与_update_state现金 → 各股收盘价 → 各股持仓 → 各股 8 个技术指标维度由此算出stock_dimension len(train.tic.unique()) state_space 1 2 * stock_dimension len(INDICATORS) * stock_dimension # 股票数为 N 时即 1 10N动作空间是[-1, 1]的连续盒。step中每个动作值乘以hmax再取整得到股数0.5 即买 50 股。撮合时先处理全部卖出按动作升序再处理全部买入避免同一步内现金错配。买入数量受现金 ÷ (价格 × (1 成本))约束卖出数量取min(|动作|, 当前持仓)手续费逐笔累计到cost训练结束打印。奖励 期末总资产 − 期初总资产再乘reward_scaling压到神经网络好用的量纲。 智能体层五种算法怎么训、怎么选训练脚本只有三行models.py 的DRLAgent把五种算法收进MODELS字典get_model创建模型train_model负责训练并挂 TensorBoard 日志model_kwargs可覆盖 finrl/config.py 里的默认超参数agent DRLAgent(envenv_train) model agent.get_model(a2c) trained agent.train_model(modelmodel, tb_log_namea2c, total_timesteps50000) trained.save(TRAINED_MODEL_DIR /agent_a2c)换算法只换一个字符串notebook 用五个布尔开关决定这次训哪些。训练完模型以 SB3 zip 格式落到trained_models/目录。五种算法对比与选型算法策略类型关键超参数notebook 版训练步数特点A2Con-policy默认参数50,000最轻快先跑通流程用它PPOon-policyn_steps2048, ent_coef0.01, lr2.5e-4, batch_size128200,000最稳步数给得最多DDPGoff-policy默认参数50,000连续动作经典方案TD3off-policybatch_size100, buffer_size1e6, lr1e-350,000双评价 延迟更新缓解过估计SACoff-policybatch_size128, buffer_size1e5, lr1e-4, ent_coefauto_0.170,000最大熵框架探索充分选型口诀先用 A2C 五千步的十分之一量级5 万步验证环境和数据管线没写错再上 PPO 跑满 20 万步拿稳的答案怀疑评价网络高估价值就换 TD3想让探索更充分就换 SAC。⚖️ 验证层样本外回测与 MVO、DJIA 双基线对比样本外预测只是逐日跑 predict把训练好的模型与trade_data.csv放同一目录按训练时完全相同的参数重建环境只是额外加上turbulence_threshold70与risk_indicator_colvix作用见最后一节trained_a2c A2C.load(trained_models/agent_a2c) e_trade_gym StockTradingEnv(dftrade, turbulence_threshold70, risk_indicator_colvix, **env_kwargs) df_value, df_actions DRLAgent.DRL_prediction( modeltrained_a2c, environmente_trade_gym)DRL_prediction逐日调用model.predict推进环境返回账户净值序列与每日动作矩阵。其余四个算法写法完全相同只换模型变量。两条基线怎么搭DRL 曲线单独看没有意义notebook 设了两条经典基线MVO均值方差优化用训练期收盘价算平均收益向量与协方差矩阵用 PyPortfolioOpt 的EfficientFrontier求最大夏普组合单股权重上限 0.5整个交易期持有不动DJIA买入持有道琼斯工业平均指数ticker 为dji首日指数归一到 1,000,000与 DRL 账户初始资金对齐。MVO 核心就几行ef EfficientFrontier(meanReturns, covReturns, weight_bounds(0, 0.5)) weights ef.clean_weights() mvo_weights np.array([1_000_000 * weights[i] for i in range(29)])最后把五条 DRL 净值、MVO、DJIA 横向拼成一张图——这就是我到底比躺平强在哪的标准回答方式。一个提醒训练期2009 至 2020与交易期不同样本外越拉越长收益优势alpha会衰减。官方建议按月或按季度重训而不是一次训练用到永远。️ 落地与扩展真实摩擦、turbulence 风控与命令行入口市场摩擦在环境里如何体现上面的回测与真实盘口的差距来自环境内置的细节买卖各收 0.1% 手续费hmax限制单日单股交易量现金不足就买不了那么多没有持仓就不能卖。这些约束让净值曲线像真的。turbulence 风控的触发方式是回测时risk_indicator_colvix让环境读 VIX 列作为风险信号一旦达到 70step会把当天动作强制改成全部卖出每只股票-hmax智能体没有选择权只能清仓——市场崩盘时自动缩头这正是数据层那个 turbulence/VIX 指数的下游用途。命令行跑同一套流程不写 notebook 的话finrl/main.py 提供脚本入口日期、股票池、算法超参数都集中在 finrl/config.pypython main.py --modetrain # 训练 python main.py --modetest # 回测 python main.py --modetrade # 纸面/实盘需在 config_private.py 填 Alpaca 参数下一步深入两条路用一只股票的一天走通三层不要先读架构文档。取 processed 数据里某只股票某一天的行手算它的状态向量放进StockTradingEnv.step走一遍逐行看现金、持仓怎么变。把这个最小闭环走通后再看 docs/source/start/three_layer.rst数据层、环境层、智能体层的每段文字都会对上图中的位置。改完配置再跑脚本命令行路线的第一步不是运行而是改config.py——把日期区间与股票列表换成自己的数据范围或替换INDICATORS里的指标再跑--modetrain对比改动前后的 TensorBoard 曲线。只有亲手拨动过变量才知道哪些配置真的影响结果。【免费下载链接】FinRLFinRL®: Financial Reinforcement Learning. 项目地址: https://gitcode.com/gh_mirrors/fi/FinRL-Library创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
华芯为8通道温度/程控电阻箱 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 2:30:46
网盘直链下载怎么做?LinkSwift 让百度网盘、阿里云盘等 8 家网盘直链一步取出 网盘直链下载怎么做?LinkSwift 让百度网盘、阿里云盘等 8 家网盘直链一步取出 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘… · 2026/11/3 3:25:52
Folia 安装教程:Windows / macOS / Linux 全平台下载与部署指南 Folia 安装教程:Windows / macOS / Linux 全平台下载与部署指南 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major
Folia 是一个把歌词… · 2026/11/2 20:57:08
强电磁产线接近开关误报警排查:干扰路径、抗干扰设计与选型验证 在变频驱动、伺服系统与电阻焊设备高度集中的产线上,非接触式位置检测的稳定性会直接影响节拍与良率。接近开关结构并不复杂,但输出只有通断两种状态,一次误触发就等同于向控制系统送入一条错误逻辑。本文按“问题背景—原理分析—干扰路径—… · 2026/11/4 2:30:14
AI 写的歌怎么救回来?四个隐藏功能手把手教给你 ◆ 一、读者是谁,解决什么问题如果你满足下面任意一条,这篇是写给你的: 用 AI 生成音乐做视频 BGM、播客片头、短剧配乐,量已经上来了,但成品始终「差一口气」; 生成接口调得动,交付却总要人工… · 2026/11/4 2:30:14
本地桌面客户端入门开发 1、Electron框架
官网地址:简介 | Electron
2、创建项目并安装依赖
mkdir my-electron-app
cd my-electron-app
npm init -y
npm install electron electron-builder --save-dev
3. 项目结构
my-electron-app/
├── package.json
├── main.js
└── inde… · 2026/11/4 2:30:14
程序崩了不要慌!Python 异常处理从 try-except 到自定义异常,老哥给你兜底 Python 是解释型语言,运行到哪才检查到哪。所以程序报错不丢人,怎么兜住错误让程序继续跑才是本事。Python 有两类错误:语法错误和异常。语法错误:程序解析时遇到的,如 while True print(1) 少了冒号 → SyntaxError&a… · 2026/11/4 2:30:14
SVN记录 SVN工程的IP存在修改,然后SVN up失败,如何快速修改本地文件指向的SVN工程?
当 SVN 服务器的 IP 地址发生变更后,本地工作副本仍指向旧地址,会导致 svn update 失败。要快速将本地项目重新指向新的 SVN 工程,最推荐且无损的方式是使用** Relocate(重新定位) **功能。 以… · 2026/11/4 2:29:14
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46