ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TensorTrade 交易基础指南:为强化学习实践者拆解订单、手续费、滑点与投资组合

TensorTrade 交易基础指南:为强化学习实践者拆解订单、手续费、滑点与投资组合 人工智能金融科技机器学习【免费下载链接】tensortradeAn open source reinforcement learning framework for training, evaluating, and deploying robust trading agents.项目地址https://gitcode.com/gh_mirrors/te/tensortrade点击查看免费下载本指南面向已经熟悉 agent、reward 与 policy 的强化学习RL实践者系统讲解进入交易领域必须掌握的基础知识订单簿、订单类型、手续费与滑点、持仓与投资组合、PL 与 reward 的本质区别以及常用交易指标。读完本篇你将理解 TensorTrade 中订单从生成到成交的完整链路能正确配置ExchangeOptions与滑点模型看懂Portfolio.net_worth的计算口径并能在训练中同时跟踪 PL 与 reward 两个信号避免方向预测正确却仍然亏钱的经典误区。学习目标完成本篇教程后你将理解订单与执行是如何工作的market order / limit order 的区别与源码实现什么是手续费commission与滑点slippage以及它们对 RL 训练的真实影响投资组合portfolio与持仓position是如何组织的净值net worth如何计算为什么 PL盈亏不同于 reward学习信号以及两者应如何配合使用TensorTrade 的 OMSOrder Management System中各组件如何协作完成一次交易。市场交易发生的地方订单簿Order Book当你进行交易时你实际上是在与一个订单簿交互。真实交易所的订单簿按价格聚合了所有买家和卖家的挂单如下所示BTC/USD 为例ORDER BOOK (BTC/USD) ──────────────────────────────────────── ASKS (Sellers) $100,150 | 0.5 BTC $100,100 | 1.2 BTC $100,050 | 0.8 BTC ← Best ask ────────── SPREAD ($50) ────────────── $100,000 | 2.0 BTC ← Best bid $99,950 | 1.5 BTC $99,900 | 3.0 BTC BIDS (Buyers) ────────────────────────────────────────核心概念Bid买价买方愿意支付的最高价格Ask卖价卖方愿意接受的最低价格Spread价差bid 与 ask 之间的差距是市场流动性的直观度量Liquidity流动性每个价位上挂单的成交量大小流动性越薄大单成交对价格的冲击越大。在 TensorTrade 中的简化TensorTrade 用单一价格流price stream来模拟市场而不维护完整的订单簿。从源码看Exchange 通过__call__(*streams)注册价格流并以exchange_name:/base-quote的命名规范存储quote_price(trading_pair)方法直接从_price_streams中读取当前价格并做精度量化exchange.py。也就是说环境里每一时刻只有一个成交价bid/ask 价差等微观结构在默认的模拟执行服务中被抽象掉了。订单如何进行交易市价单Market Order立即以当前可得价格买入/卖出。# 你希望立即买入 0.1 BTC order MarketOrder(sideBUY, quantity0.1 * BTC) # 执行结果 # - 以最佳卖价成交$100,050 # - 你需要支付 $10,005 手续费优点保证成交guaranteed execution。缺点市场流动性薄时可能拿到糟糕的价格。限价单Limit Order只有当价格达到我的目标时才买入/卖出。# 你希望买入 0.1 BTC但仅在 $99,900 或更低价格成交 order LimitOrder(sideBUY, price99900, quantity0.1 * BTC) # 执行结果 # - 只有当价格跌到 $99,900 时才成交 # - 如果价格上涨可能永远不会成交优点控制成交价格。缺点可能无法执行might never fill。TensorTrade 主要使用市价单立即执行这也是默认的 BSHBuy-and-Hold买入持有等动作方案的核心假设。源码中的真实 API工厂函数与执行逻辑需要说明的是上述代码是教学用的简化写法。在当前仓库的实际源码中订单是通过 create.py 中的工厂函数创建的例如from tensortrade.oms.orders.create import market_order, limit_order # market_order(side, exchange_pair, price, size, portfolio) # limit_order(side, exchange_pair, limit_price, size, portfolio, startNone, endNone)工厂函数内部会构造Order对象定义于 order.py它包含side、trade_type、exchange_pair、price、quantity等字段并在创建时通过portfolio.get_wallet(...)锁定对应钱包的资金wallet.lock(...)同时维护OrderStatus状态机PENDING → OPEN → PARTIALLY_FILLED → FILLED / CANCELLEDorder.py。在模拟执行服务 simulated.py 中限价单的执行条件非常明确买单if order.type TradeType.LIMIT and order.price current_price: return None——只有当限价 ≥ 当前市价时才可能成交卖单if order.type TradeType.LIMIT and order.price current_price: return None——只有当限价 ≤ 当前市价时才可能成交。这与真实市场中限价单只在价格达到目标时才执行的行为一致也解释了为什么限价单可能永远不成交。手续费交易的代价手续费是什么每笔交易都要支付费用这是交易所的主要收入来源。交易买入 $10,000 的 BTC 手续费率0.1% 应付手续费$10,000 × 0.001 $10 你原本想要 $10,000 的 BTC 实际得到价值 $9,990 的 BTC为什么手续费对 RL 至关重要场景Agent 做了许多笔小额盈利交易 交易 1$5 利润-$10 手续费 -$5 净亏损 交易 2$8 利润-$10 手续费 -$2 净亏损 交易 3$12 利润-$10 手续费 $2 净利润 交易 4$3 利润-$10 手续费 -$7 净亏损 预测方向带来的总利润$28 支付的总手续费-$40 净 PL-$12 亏损 Agent 方向判断全对却仍然亏钱TensorTrade 中的手续费配置exchange_options ExchangeOptions(commission0.001) # 0.1%源码级验证手续费如何在成交时被扣除ExchangeOptions 的完整参数包括参数源码默认值含义commission0.003交易所收取的订单金额百分比注意源码默认是 0.3%教程示例常用 0.1% 即0.001min_trade_size1e-6订单允许的最小交易数量max_trade_size1e6订单允许的最大交易数量min_trade_price1e-8交易所允许的最小价格max_trade_price1e8交易所允许的最大价格is_liveFalse是否向交易所提交真实订单在 simulated.py 的execute_buy_order/execute_sell_order中手续费的扣减逻辑是硬编码的filled order.remaining.contain(order.exchange_pair) commission options.commission * filled quantity filled - commission即先按当前价计算应得数量再从中扣掉commission × filled的手续费剩下的才是真正进入钱包的数量。Exchange.execute_order最终调用order.fill(trade)完成结算exchange.py。值得注意的是源码还处理了一个边界情况若手续费率大于 0 但计算出的手续费低于该币种精度Decimal(10) ** -filled.instrument.precision会触发告警并把手续费抬升到最小精度值——这提醒我们在定义自定义币种时要注意precision的取值。滑点执行过程中的价格波动滑点是什么从你决定交易到订单真正成交之间价格可能已经移动。你看到BTC 价格为 $100,000 你决定买入 时间流逝100ms 成交时BTC 已变为 $100,050 你实际支付$100,050而非 $100,000 滑点$500.05%在 TensorTrade 中模拟滑点TensorTrade 可以模拟滑点from tensortrade.oms.services.slippage import RandomSlippageModel slippage_model RandomSlippageModel(max_slippage0.01) # 最多 1%训练阶段我们通常忽略滑点专注于策略学习本身。源码级验证当前仓库中的滑点模型需要说明的是当前仓库源码中实际导出的类名与上述教学代码略有不同。查看 tensortrade/oms/services/slippage/init.py 与 random_slippage_model.pyfrom tensortrade.oms.services.slippage import RandomUniformSlippageModel # 参数名是 max_slippage_percent百分比默认 3.0即最大 3% model RandomUniformSlippageModel(max_slippage_percent1.0) # 最多 1%其核心逻辑adjust_trade(trade)会从[0, max_slippage_percent/100]均匀采样一个滑点比例然后市价买单成交价上调为price × (1 slippage)市价卖单成交价下调为price × (1 - slippage)限价单同样先调整价格再按调整后价格与初始价格之比缩减成交量trade.size * min(initial_price / trade.price, 1)保证不会以劣于限价的成本成交。该模型在仓库中以uniform为注册名可通过get(uniform)工厂方法获取。若你希望模拟更复杂的滑点行为可以继承SlippageModel基类自定义adjust_trade。持仓你拥有的东西多头持仓Long Position你持有资产本身。价格上涨时你获利。以 $100,000 买入 0.1 BTC成本$10,000 价格涨到 $110,000 你的 0.1 BTC 现在价值$11,000 利润$1,00010%现金持仓Flat / Cash你只持有现金。价格波动不会让你盈利或亏损。持有 $10,000 USD BTC 价格从 $100,000 涨到 $110,000 你的 USD 仍然价值$10,000 利润$0空头持仓Short Position你借入资产并卖出。价格下跌时你获利。借入 0.1 BTC以 $100,000 卖出获得$10,000 价格跌到 $90,000 以 $9,000 买回 0.1 BTC 归还借来的 BTC 利润$1,000注意TensorTrade 的 BSHBuy-and-Hold Scheme动作方案不支持真正的做空。动作 1 表示持有现金而不是开空仓。也就是说在默认动作空间里agent 只能在买入持有与空仓现金之间切换无法通过借券卖出来做空获利。这一点在配置动作方案、设计奖励函数时务必牢记否则会高估策略的真实盈利空间。投资组合你的账户组成部分┌─────────────────────────────────────────┐ │ Portfolio │ │ │ │ ┌─────────────────────────────────┐ │ │ │ USD Wallet │ │ │ │ Balance: $5,000 │ │ │ └─────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────┐ │ │ │ BTC Wallet │ │ │ │ Balance: 0.05 BTC │ │ │ └─────────────────────────────────┘ │ │ │ │ Current BTC Price: $100,000 │ │ BTC Value: 0.05 × $100,000 $5,000 │ │ │ │ Net Worth $5,000 $5,000 $10,000 │ └─────────────────────────────────────────┘净值Net Worth计算net_worth usd_balance (btc_balance × btc_price)净值在以下情况会发生变化持有资产的价格发生变化即使你什么都不做你进行交易手续费会减少净值你收到入金或进行提款。源码级验证PortfolioPortfolio类以base_instrument为计价基准通常是你账户的计价货币如 USD维护一组Walletbalance(instrument)跨所有钱包汇总某一币种当前可用余额locked_balance(instrument)被订单锁定、尚未释放的余额total_balance(instrument)可用 锁定之和net_worth当前总净值由on_next(data)在每个时间步从观察数据中的net_worth字段更新profit_loss自上次重置以来的净值盈亏百分比定义为1.0 - net_worth / initial_net_worthportfolio.pyledger全局交易账本记录所有转账明细对应 ledger.py。Wallet.transfer负责在买卖时真正搬运资金买单时从 quote 钱包如 USD扣款、向 base 钱包如 BTC入账卖单则相反手续费以独立字段随交易记录。这套钱包 账本 净值的结构正是环境观察量observations与奖励计算rewards的数据来源。PL 与 Reward 的区别它们是两回事PL盈亏Profit Loss真实赚到/亏掉的钱。PL 最终净值 - 初始净值Reward奖励提供给 agent 的学习信号。Reward f(state, action, next_state) # 可以是任何东西示例初始$10,000 最终$9,500 PL-$500 但在一整个 episode 中 - Agent 正确预测了 5 次价格走势reward 500 - Agent 错误预测了 3 次价格走势reward -300 - Agent 在崩盘时选择持有避免了损失reward 200 总 Reward400 PL-$500亏钱了 Reward400学到了有用的行为为什么这很重要你可能会遇到正 reward 负 PLagent 在学习但策略尚未盈利正 PL 负 reward纯粹运气好策略本身很糟糕高 reward 却被手续费吞噬利润频繁交易导致成本过高。训练期间务必同时跟踪 PL 与 reward 两个指标。在 TensorTrade 中Portfolio.performance会按时间步记录net_worth等关键序列profit_loss给出净值变化比例而 reward 由 reward_scheme 独立定义——两者天然解耦正适合分别监控。交易指标收益率ReturnReturn (最终 - 初始) / 初始 × 100% 示例$10,000 → $10,500 Return 500 / 10000 × 100 5%回撤Drawdown从峰值的最大下跌幅度。峰值$12,000 谷底$9,000 Drawdown (12000 - 9000) / 12000 25% ┌──────────────────────────────────┐ │ $12,000 ──── PEAK │ │ \ │ │ \ │ │ \ ← 25% Drawdown │ │ \ │ │ $9,000 ─── TROUGH │ └──────────────────────────────────┘夏普比率Sharpe Ratio风险调整后的收益。Sharpe (平均收益率 - 无风险利率) / 收益率标准差 Sharpe 1良好 Sharpe 2优秀 Sharpe 0在亏钱警告夏普比率不适合直接作为 RL 的奖励函数具体原因见 pitfalls 相关讨论。它更适合作为训练后的评估指标而非每一步的学习信号。TensorTrade 的订单管理系统OMS组件架构┌─────────────────────────────────────────────────────────────┐ │ OMS Architecture │ │ │ │ Agent Decision │ │ │ │ │ v │ │ ┌───────────────┐ │ │ │ ActionScheme │ Converts action to Order │ │ └───────┬───────┘ │ │ │ │ │ v │ │ ┌───────────────┐ │ │ │ Broker │ Manages order lifecycle │ │ └───────┬───────┘ │ │ │ │ │ v │ │ ┌───────────────┐ │ │ │ Exchange │ Executes order, applies commission │ │ └───────┬───────┘ │ │ │ │ │ v │ │ ┌───────────────┐ │ │ │ Portfolio │ Updates wallet balances │ │ └───────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘各组件职责ActionScheme把离散/连续动作转换为具体的Order例如 BSH 的全部换成 BTC就对应proportion_orderBroker管理订单生命周期——维护unexecuted待执行队列与executed已执行字典每个时间步调用update()检查哪些订单可执行order.is_executable并自动取消过期订单broker.pyExchange调用执行服务默认是 simulated.py 中的execute_order完成撮合应用手续费并产生Trade记录Portfolio根据成交结果更新各钱包余额与净值。订单的实际流转路径为ActionScheme.perform(action)→Broker.submit(order)→Broker.update()→Exchange.execute_order(order, portfolio)→order.fill(trade)→ 钱包余额与净值更新。整个链条的详细拆解见配套教程 02-oms-deep-dive.md。代码示例手动搭建一个最小 OMSfrom tensortrade.oms.exchanges import Exchange, ExchangeOptions from tensortrade.oms.instruments import USD, BTC from tensortrade.oms.wallets import Wallet, Portfolio from tensortrade.oms.services.execution.simulated import execute_order # 创建带 0.1% 手续费的交易所 exchange_options ExchangeOptions(commission0.001) exchange Exchange(sim, serviceexecute_order, optionsexchange_options) # 创建钱包 usd_wallet Wallet(exchange, 10000 * USD) # $10,000 btc_wallet Wallet(exchange, 0 * BTC) # 0 BTC # 创建投资组合 portfolio Portfolio(USD, [usd_wallet, btc_wallet]) # 查看状态 print(portfolio.net_worth) # $10,000这段代码对应仓库中 examples/training/train_simple.py、examples/training/train_profit.py 等训练脚本所依赖的 OMS 装配模式相关行为由 test_exchange.py、test_portfolio.py 等单元测试覆盖。实战练习计算一次完整交易请计算以下场景的最终结果初始$10,000 USD0 BTC BTC 价格$100,000 手续费0.1% 第 1 步买入把全部 USD 换成 BTC - USD 支出$10,000 - 手续费$100.1% - 收到 BTC$9,990 / $100,000 0.0999 BTC - 新余额$0 USD0.0999 BTC - 净值0.0999 × $100,000 $9,990 第 2 步价格上涨到 $105,000 - 余额$0 USD0.0999 BTC - 净值0.0999 × $105,000 $10,489.50 - 未实现盈亏$489.50 第 3 步卖出把全部 BTC 换成 USD - 卖出 BTC0.0999 × $105,000 $10,489.50 - 手续费$10.490.1% - 收到 USD$10,479.01 - 新余额$10,479.01 USD0 BTC - 净值$10,479.01 最终 PL$10,479.01 - $10,000 $479.01 不是 $500因为手续费这个练习的每一步都严格对应 simulated.py 中先按价格折算数量、再扣手续费、最后完成钱包转账的结算流程——你可以把上述数字代入commission options.commission * filled亲自验证。关键要点手续费侵蚀每一笔交易—— 0.1% 的手续费率在频繁交易下会快速累积方向判断正确也可能亏钱PL ≠ Reward—— 两个都要跟踪最终目标应该是优化 PL净值随价格波动—— 即使完全不交易持有资产的净值也会变化多头 价格上涨时获利现金 不暴露于价格波动而 TensorTrade 的 BSH 动作方案不支持真正做空在 TensorTrade 中订单执行是即时的默认使用市价单限价单则需满足价格条件才会成交。自检清单Checkpoint继续学习之前请确认你已经理解手续费如何影响每一笔交易为什么频繁交易代价高昂净值计算包含哪些要素各币种余额 × 当前价格再扣除手续费PL 与 reward 的区别以及为何要同时跟踪两者。下一步02-oms-deep-dive.md —— 深入剖析 TensorTrade 的订单管理系统订单流转、钱包与余额机制、交易所配置选项与自定义执行行为01-trading-basics 所在课程索引 —— 查看完整课程导航03-your-first-run.md —— 把交易基础概念接入 TensorTrade 环境跑通你的第一个完整训练流程。赞分享人工智能金融科技机器学习【免费下载链接】tensortradeAn open source reinforcement learning framework for training, evaluating, and deploying robust trading agents.项目地址https://gitcode.com/gh_mirrors/te/tensortrade点击查看免费下载相关推荐终极指南如何用ExplorerPatcher免费恢复Windows 10经典界面终极指南如何用ExplorerPatcher免费恢复Windows 10经典界面 你是否怀念Windows 10那简洁高效的任务栏和开始菜单微软的Windo桌面应用系统编程TensorTrade OMS 深入解析订单管理系统、投资组合与订单生命周期实战指南TensorTrade OMS 深入解析订单管理系统、投资组合与订单生命周期实战指南 TensorTrade 是一个面向强化学习交易智能体的开源框架而 te人工智能金融科技机器学习终极TensorTrade强化学习交易环境配置指南5步快速搭建AI交易系统终极TensorTrade强化学习交易环境配置指南5步快速搭建AI交易系统 TensorTrade是一个开源的 强化学习交易框架 专门用于训练、评估和部署稳人工智能金融科技机器学习上一篇RDPWrap多用户远程桌面配置终极指南高效解决Windows更新兼容性问题下一篇TimesFM 2.5 LoRA 参数高效微调实战基于 HuggingFace Transformers 与 PEFT 的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表