ARTICLE DETAIL

资讯详情

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

TensorTrade 数据接入指南:用 tensortrade.data.cdd 的 CryptoDataDownload 拉取加密货币行情数据

TensorTrade 数据接入指南:用 tensortrade.data.cdd 的 CryptoDataDownload 拉取加密货币行情数据 人工智能金融科技机器学习【免费下载链接】tensortradeAn open source reinforcement learning framework for training, evaluating, and deploying robust trading agents.项目地址https://gitcode.com/gh_mirrors/te/tensortrade点击查看免费下载本篇技术指南围绕 TensorTrade 的tensortrade.data数据包及其核心子模块tensortrade.data.cdd展开讲解如何通过CryptoDataDownload类从 CryptoDataDownload 免费数据源一键获取交易所历史行情OHLCV并将其清洗、对齐后无缝接入DataFeed、Exchange与强化学习训练环境。读完本文你将掌握fetch/fetch_default/fetch_gemini三个方法的调用参数、返回数据的列结构与时间戳处理细节并能在训练脚本与 Notebook 中复现完整的数据加载链路。一、tensortrade.data 包数据从何而来在 TensorTrade 的模块体系中tensortrade.data是负责外部数据采集的顶层包。它只有一个公开子模块tensortrade.data.cdd该模块的定位非常明确从数据源站点收集加密货币历史数据并以pandas.DataFrame的形式返回给上层组件。tensortrade.data.cdd的模块 docstring 直接写明了它的用途见 tensortrade/data/cdd.pyContains methods and classes to collect data from cryptodatadownload.com.也就是说TensorTrade 本身不内置行情数据库训练所需的 OHLCV 历史数据通过该模块按需拉取。拉取得到的 DataFrame 后续会进入 tensortrade/feed/core/feed.py 中的DataFeed/Stream被包装成可迭代的特征流再供给交易环境env的观察者Observer与动作方案使用。整条链路是CryptoDataDownload.fetch() → DataFrame(OHLCV) → Stream.source(list(df[col]), dtypefloat) → DataFeed(features) → env.observer → 强化学习环境在 docs 的 API 文档体系中tensortrade.data.rst与tensortrade.data.cdd.rst分别通过automodule指令自动生成这两个模块的 API 参考页见 docs/source/api/tensortrade.data.rst 与 docs/source/api/tensortrade.data.cdd.rst本指南即基于cdd.py的真实实现与其在示例中的实际用法展开。二、CryptoDataDownload 类总览CryptoDataDownload是tensortrade.data.cdd中唯一的公开类定义于 tensortrade/data/cdd.py#L13-L30。它的职责是给定交易所名称、交易对符号与时间周期拼出 CSV 文件的下载地址读取后做统一的列重命名与时间解析返回规整的 OHLCV DataFrame。类的公开属性与方法如下成员类型说明url属性str数据源根地址__init__中固定为https://www.cryptodatadownload.com/cdd/fetch_default(...)方法针对采用“标准命名与结构”的交易所数据文件进行下载与清洗fetch_gemini(...)方法针对 Gemini 交易所的专属格式进行下载与清洗fetch(...)方法统一入口内部按交易所名自动分派到上述两个方法模块顶部还做了一件值得注意的事tensortrade/data/cdd.py#L10ssl._create_default_https_context ssl._create_unverified_context该语句全局放宽了 SSL 证书校验是为了避免某些网络环境下下载数据文件时因证书问题而报错。它属于模块级副作用在使用本模块时即生效这一点在排查“为什么 import 后 TLS 校验变了”这类问题时需要留意。2.1 fetch统一的数据获取入口fetch是日常使用最多的方法签名与参数含义如下tensortrade/data/cdd.py#L119-L149def fetch(self, exchange_name: str, base_symbol: str, quote_symbol: str, timeframe: str, include_all_volumes: bool False) - pd.DataFrame:参数类型含义示例exchange_namestr交易所名称不区分大小写Bitfinex、Bitstamp、geminibase_symbolstr计价货币Base Currency即交易对中靠前的币种USDquote_symbolstr标的货币Quote Currency即交易对中靠后的币种BTCtimeframestr时间周期可选{d, h, m}日线/小时线/分钟线可带数字前缀1h、1d、30minclude_all_volumesbool是否同时保留 base 与 quote 两个成交量列默认FalseFalse/True返回值为pd.DataFrame包含date、open、high、low、close、volume等列。fetch内部的分派逻辑是if exchange_name.lower() gemini: return self.fetch_gemini(base_symbol, quote_symbol, timeframe) return self.fetch_default(exchange_name, base_symbol, quote_symbol, timeframe, include_all_volumesinclude_all_volumes)即交易所名忽略大小写为gemini时走 Gemini 专用分支其余交易所一律走通用分支。2.2 fetch_default通用交易所的标准数据清洗fetch_default针对绝大多数交易所的 CSV 文件结构做处理tensortrade/data/cdd.py#L32-L84其核心步骤可以拆解为拼接文件名{exchange}_{quote}{base}_{timeframe}.csv例如Bitfinex_USDBTC_1h.csv读取并倒序pd.read_csv(url filename, skiprows1)跳过首行表头说明随后df[::-1]将数据按时间正序排列源文件通常是时间倒序删除冗余列df.drop([symbol], axis1)去掉交易对标识列列名标准化将Volume BTC→volume_base、Volume USD→volume_quote、Date→date时间戳归一化unix列统一转int若为 13 位毫秒级时间戳则除以 1000 转为秒级再用pd.to_datetime(df[unix], units)解析为datetime并设为索引date统一小写列名df.columns [name.lower() ...]随后reset_index()把date恢复为普通列按需裁剪成交量列当include_all_volumesFalse默认时丢弃volume_quote并把volume_base重命名为volume最终返回只含date/open/high/low/close/volume的紧凑 DataFrame当include_all_volumesTrue时volume_base与volume_quote两列同时保留。从源码结构看默认返回的列顺序为date, open, high, low, close, volume这与后续示例中data[[date, open, high, low, close, volume]]的选取方式完全吻合。2.3 fetch_geminiGemini 交易所的专属分支Gemini 的 CSV 格式与通用格式不同因此单独处理tensortrade/data/cdd.py#L86-L117。该分支的差异点在于timeframe 转换若 timeframe 以h结尾如1h会先转换为1hr以匹配 Gemini 文件名中的hr后缀文件名模板gemini_{quote}{base}_{timeframe}.csv不带交易所前缀重复删除列不同删除Symbol与Unix Timestamp两列不做毫秒级时间戳换算直接df[::-1]倒序、列名小写化、以date为索引后reset_index()返回。需要说明的是fetch_gemini不接受include_all_volumes参数且该方法没有显式的时间戳归一化逻辑——这是与通用分支的显著差异使用时建议确认源文件本身的date列格式。三、实战一单交易所单标的的基本拉取仓库中几乎所有的训练脚本都采用同一套加载范式。以最简单的 examples/training/train_simple.py 为例from tensortrade.data.cdd import CryptoDataDownload cdd CryptoDataDownload() data cdd.fetch(Bitfinex, USD, BTC, 1h) data data[[date, open, high, low, close, volume]] data data.tail(200).reset_index(dropTrue) print(fUsing {len(data)} rows | Price range: f${data[close].min():,.0f} - ${data[close].max():,.0f})这段代码做了三件事拉取从 Bitfinex 获取 BTC/USD 的 1 小时 K 线fetch内部已完成列标准化所以data[[date, ...]]的列名可以直接命中截取tail(200)只保留最近 200 根 K 线约 8 天小时级数据reset_index(dropTrue)把行号重整为从 0 开始的连续整数——这保证了后续Stream.source(list(data[close]))按行喂数据时不会携带原始索引输出诊断打印数据规模与收盘价区间用于快速校验数据是否正常。在 docs/tutorials/01-foundations/03-your-first-run.md 中这段代码被明确标注为“数据获取环节的核心代码”说明该加载模式是 TensorTrade 入门教程的官方推荐路径。拉取到的 DataFrame 随后会被包装成Stream并注册为交易所的价格流与环境的特征流from tensortrade.feed.core import Stream, DataFeed from tensortrade.oms.exchanges import Exchange, ExchangeOptions from tensortrade.oms.services.execution.simulated import execute_order price_data list(data[close]) price Stream.source(price_data, dtypefloat).rename(USD-BTC) exchange Exchange(exchange, serviceexecute_order, optionsExchangeOptions(commission0.001))(price) features [Stream.source(list(data[c]), dtypefloat).rename(c) for c in [open, high, low, close, volume]] feed DataFeed(features) feed.compile()可见CryptoDataDownload只是数据链路的起点它产出的标准 OHLCV DataFrame 是后续所有Stream、Exchange与DataFeed组件的统一输入。四、实战二多交易所、多资产的数据融合当需要在同一环境里同时使用多个交易所、多个币种的数据时官方示例采用pd.concat(..., axis1)按列拼接再用add_prefix加前缀区分来源。docs/source/examples/setup_environment_tutorial.md 给出了完整范例import pandas as pd from tensortrade.data.cdd import CryptoDataDownload cdd CryptoDataDownload() bitfinex_data pd.concat([ cdd.fetch(Bitfinex, USD, BTC, 1h).add_prefix(BTC:), cdd.fetch(Bitfinex, USD, ETH, 1h).add_prefix(ETH:) ], axis1) bitstamp_data pd.concat([ cdd.fetch(Bitstamp, USD, BTC, 1h).add_prefix(BTC:), cdd.fetch(Bitstamp, USD, LTC, 1h).add_prefix(LTC:) ], axis1)这里的要点同一交易所的多个币对用add_prefix(BTC:)/add_prefix(ETH:)打上币种标签横向拼接后形成形如BTC:close、ETH:close的列不同交易所的数据分开存放bitfinex_data与bitstamp_data随后各自注册为独立的Exchange实例因为同一个交易所的价格流必须挂在同名的Exchange上见同文件的 Exchange 定义段落fetch返回的date列在各币对间是相同的索引因此concat(axis1)可以自然对齐时间轴。拼接完成后价格流与特征流通过NameSpace划分命名空间避免同名特征冲突with NameSpace(bitfinex): bitfinex_streams [ Stream.source(list(bitfinex_btc[c]), dtypefloat).rename(c) for c in bitfinex_btc.columns ] ... feed DataFeed(bitfinex_streams bitstamp_streams)feed.next()输出的每个键形如bitfinex:/BTC:close、bitstamp:/LTC:volume命名空间 币种前缀 特征名的三级结构正是add_prefix与NameSpace共同作用的结果。这一模式同样出现在 examples/setup_environment_tutorial.ipynb 与 docs/source/examples/ledger_example.md 中后者还演示了cdd.fetch(Bitfinex, USD, ETH, 1h)、cdd.fetch(Bitstamp, USD, LTC, 1h)等多币种拉取。五、实战三接入强化学习训练脚本在 Ray RLlib 训练脚本中CryptoDataDownload被用于加载训练与评估所需的完整历史数据。以 examples/training/train_advanced.py 为例print(\nLoading data...) cdd CryptoDataDownload() data cdd.fetch(Bitfinex, USD, BTC, 1h) data data[[date, open, high, low, close, volume]] data[date] pd.to_datetime(data[date])随后数据会被切分为训练集与测试集并分别构建价格流与特征流。类似地examples/training/train_profit.py、examples/training/train_historical.py、examples/training/train_walkforward.py、examples/training/train_robust.py 等脚本都使用cdd.fetch(Bitfinex, USD, BTC, 1h)这一标准调用说明它是仓库内所有训练入口共享的数据加载约定。关于返回数据的进一步预处理Notebook 示例 examples/train_and_evaluate.ipynb 中的prepare_data函数给出了常用的清洗步骤def prepare_data(df): df[volume] np.int64(df[volume]) # 成交量转整型避免浮点精度问题 df[date] pd.to_datetime(df[date]) # 日期列显式解析 df.sort_values(bydate, ascendingTrue, inplaceTrue) # 确保按时间正序 df.reset_index(dropTrue, inplaceTrue) df[date] df[date].dt.strftime(%Y-%m-%d %I:%M %p) # 格式化时间供展示 return df虽然fetch_default内部已经做过倒序与时间解析但显式的sort_values与reset_index仍是训练前数据整理的稳妥做法尤其当数据后续被多次切片、拼接时。六、参数细节与边界说明6.1 timeframe 的取值规则fetch与fetch_default的 docstring 均将timeframe限定为{d, h, m}三档见 tensortrade/data/cdd.py#L48-L49即日线、小时线与分钟线。仓库示例中的实际取值包括1h1 小时 K 线出现频率最高几乎全部训练脚本与 Notebook 均使用1d日线适用于较长周期策略分钟级如30m在文档中未直接出现但m后缀在源码层面是被接受的。需要注意fetch_default直接按{exchange}_{quote}{base}_{timeframe}.csv拼文件名实际可用组合取决于 CryptoDataDownload 站点是否发布对应文件若目标文件不存在pd.read_csv会直接抛错。6.2 时间戳的两种粒度fetch_default中有一处容易被忽略的兼容逻辑tensortrade/data/cdd.py#L71-L75df[unix] df[unix].astype(int) df[unix] df[unix].apply( lambda x: int(x / 1000) if len(str(x)) 13 else x ) df[date] pd.to_datetime(df[unix], units)它依据“13 位数字 毫秒级时间戳”的经验法则把毫秒级unix列换算为秒级后统一解析。这意味着无论源文件提供的是秒级还是毫秒级时间戳最终得到的date列都是规整的datetime对象——这是本模块“开箱即用”体验的关键实现细节。6.3 include_all_volumes 的作用域include_all_volumes参数只对fetch_default即 Gemini 以外的交易所生效False默认只返回volume即 base 货币成交量数据最紧凑True同时返回volume_base与volume_quote供需要双向成交量的研究使用。从源码看fetch_gemini不接收该参数返回的列以源文件结构为准。因此若你的策略需要volume_quote应优先使用支持该参数的通用分支。6.4 数据来源与适用前提本模块面向CryptoDataDownload 免费公开数据集数据文件由该站点维护文件命名与列结构需符合上述约定模块在__init__中固定url不支持自定义数据源地址若需接入其他来源可参考 examples/data/ 下已下载的 CSV如Coinbase_BTCUSD_1h.csv、Coinbase_BTCUSD_d.csv自行实现读取逻辑或使用配置化方式加载参见 examples/data/configuration.yaml由于依赖网络下载脚本运行前需保证目标站点可达模块已通过ssl._create_default_https_context ssl._create_unverified_context规避常见的证书校验问题。七、测试与验证现状关于tensortrade.data模块的自动化测试仓库的测试目录 tests/tensortrade/unit/data/ 目前只有空的__init__.py尚未包含针对CryptoDataDownload的单元测试文件。因此对该模块的验证主要依赖两类间接证据示例运行输出docs/tutorials/01-foundations/03-your-first-run.md 展示了运行train_simple.py时fetch成功返回 200 行数据并打印价格区间的真实输出集成测试tests/tensortrade/integration/test_end_to_end.py 与 Ray 集成测试覆盖了环境构建与训练链路数据加载作为链路起点被间接验证。从源码结构可以推断CryptoDataDownload的设计目标是把“下载 清洗 时间解析”封装为一个可复用的原子步骤使上层训练脚本无需关心源文件格式差异。八、完整速查8.1 一行式拉取from tensortrade.data.cdd import CryptoDataDownload df CryptoDataDownload().fetch(Bitfinex, USD, BTC, 1h)8.2 推荐的数据准备流程结合训练脚本惯例import pandas as pd from tensortrade.data.cdd import CryptoDataDownload cdd CryptoDataDownload() data cdd.fetch(Bitfinex, USD, BTC, 1h) data data[[date, open, high, low, close, volume]] data[date] pd.to_datetime(data[date]) data.sort_values(bydate, ascendingTrue, inplaceTrue) data data.tail(200).reset_index(dropTrue) # 截取最近 200 根 K 线8.3 常用参考路径用途路径模块源码tensortrade/data/cdd.py包入口tensortrade/data/init.py最小训练示例examples/training/train_simple.py多交易所融合示例docs/source/examples/setup_environment_tutorial.md账本Ledger示例docs/source/examples/ledger_example.md首次运行教程docs/tutorials/01-foundations/03-your-first-run.md本地 CSV 示例数据examples/data/九、小结tensortrade.data.cdd是 TensorTrade 生态中承担“数据接入”职责的唯一模块CryptoDataDownload类以极简的fetch(exchange, base, quote, timeframe)接口屏蔽了文件下载、倒序、列重命名、毫秒时间戳换算等全部细节让 OHLCV 数据能够无缝进入Stream → DataFeed → 交易环境的后续链路。无论是最简单的单币种训练脚本还是跨交易所、跨币种的特征融合该模块都是官方示例中统一采用的数据入口。赞分享人工智能金融科技机器学习【免费下载链接】tensortradeAn open source reinforcement learning framework for training, evaluating, and deploying robust trading agents.项目地址https://gitcode.com/gh_mirrors/te/tensortrade点击查看免费下载相关推荐AKShare 加密货币数据接口实战金十实时行情、比特币持仓报告与 CME 成交量数据AKShare 加密货币数据接口实战金十实时行情、比特币持仓报告与 CME 成交量数据 本文聚焦 AKShare 项目中「数据中心dc」分类下的三只加密货金融科技数据分析网页爬虫鸣潮自动化一条龙ok-ww 免费三步上手挂机刷图全交给它鸣潮自动化一条龙ok ww 免费三步上手挂机刷图全交给它 鸣潮的日常是不是每天准时吃掉你二十分钟ok ww 是一款免费开源的鸣潮自动化工具靠图像识别加模GUI 自动化计算机视觉RPA人工智能Claude Code Router 使用指南给多个 AI 编程助手装上本地模型路由网关Claude Code Router 使用指南给多个 AI 编程助手装上本地模型路由网关 每天要切 DeepSeek、Kimi、Gemini 三个模型跑代码后端API网关LLM 网关大模型上一篇VueRouter 对象全解析从构造函数到路由实例化的核心机制下一篇HashCalculator3分钟掌握专业级文件完整性验证与重复文件查找创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表