[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-Yvictor--TradingGym":3,"tool-Yvictor--TradingGym":64},[4,16,31,40,48,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":15},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,2,"2026-04-06T19:52:38",[13,14],"插件","开发框架","ready",{"id":17,"name":18,"github_repo":19,"description_zh":20,"stars":21,"difficulty_score":10,"last_commit_at":22,"category_tags":23,"status":15},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",85052,"2026-04-08T11:03:08",[24,25,26,13,27,28,29,14,30],"图像","数据工具","视频","Agent","其他","语言模型","音频",{"id":32,"name":33,"github_repo":34,"description_zh":35,"stars":36,"difficulty_score":37,"last_commit_at":38,"category_tags":39,"status":15},2181,"OpenHands","OpenHands\u002FOpenHands","OpenHands 是一个专注于 AI 驱动开发的开源平台，旨在让智能体（Agent）像人类开发者一样理解、编写和调试代码。它解决了传统编程中重复性劳动多、环境配置复杂以及人机协作效率低等痛点，通过自动化流程显著提升开发速度。\n\n无论是希望提升编码效率的软件工程师、探索智能体技术的研究人员，还是需要快速原型验证的技术团队，都能从中受益。OpenHands 提供了灵活多样的使用方式：既可以通过命令行（CLI）或本地图形界面在个人电脑上轻松上手，体验类似 Devin 的流畅交互；也能利用其强大的 Python SDK 自定义智能体逻辑，甚至在云端大规模部署上千个智能体并行工作。\n\n其核心技术亮点在于模块化的软件智能体 SDK，这不仅构成了平台的引擎，还支持高度可组合的开发模式。此外，OpenHands 在 SWE-bench 基准测试中取得了 77.6% 的优异成绩，证明了其解决真实世界软件工程问题的能力。平台还具备完善的企业级功能，支持与 Slack、Jira 等工具集成，并提供细粒度的权限管理，适合从个人开发者到大型企业的各类用户场景。",70806,3,"2026-04-08T11:10:08",[29,27,14,13],{"id":41,"name":42,"github_repo":43,"description_zh":44,"stars":45,"difficulty_score":10,"last_commit_at":46,"category_tags":47,"status":15},51,"gstack","garrytan\u002Fgstack","gstack 是 Y Combinator CEO Garry Tan 亲自开源的一套 AI 工程化配置，旨在将 Claude Code 升级为你的虚拟工程团队。面对单人开发难以兼顾产品战略、架构设计、代码审查及质量测试的挑战，gstack 提供了一套标准化解决方案，帮助开发者实现堪比二十人团队的高效产出。\n\n这套配置特别适合希望提升交付效率的创始人、技术负责人，以及初次尝试 Claude Code 的开发者。gstack 的核心亮点在于内置了 15 个具有明确职责的 AI 角色工具，涵盖 CEO、设计师、工程经理、QA 等职能。用户只需通过简单的斜杠命令（如 `\u002Freview` 进行代码审查、`\u002Fqa` 执行测试、`\u002Fplan-ceo-review` 规划功能），即可自动化处理从需求分析到部署上线的全链路任务。\n\n所有操作基于 Markdown 和斜杠命令，无需复杂配置，完全免费且遵循 MIT 协议。gstack 不仅是一套工具集，更是一种现代化的软件工厂实践，让单人开发者也能拥有严谨的工程流程。",66972,"2026-04-08T11:10:00",[27,13],{"id":49,"name":50,"github_repo":51,"description_zh":52,"stars":53,"difficulty_score":10,"last_commit_at":54,"category_tags":55,"status":15},3074,"gpt4free","xtekky\u002Fgpt4free","gpt4free 是一个由社区驱动的开源项目，旨在聚合多种可访问的大型语言模型（LLM）和媒体生成接口，让用户能更灵活、便捷地使用前沿 AI 能力。它解决了直接调用各类模型时面临的接口分散、门槛高或成本昂贵等痛点，通过统一的标准将不同提供商的资源整合在一起。\n\n无论是希望快速集成 AI 功能的开发者、需要多模型对比测试的研究人员，还是想免费体验最新技术的普通用户，都能从中受益。gpt4free 提供了丰富的使用方式：既包含易于上手的 Python 和 JavaScript 客户端库，也支持部署本地图形界面（GUI），更提供了兼容 OpenAI 标准的 REST API，方便无缝替换现有应用后端。\n\n其技术亮点在于强大的多提供商支持架构，能够动态调度包括 Opus、Gemini、DeepSeek 等多种主流模型资源，并支持 Docker 一键部署及本地推理。项目秉持社区优先原则，在降低使用门槛的同时，也为贡献者提供了扩展新接口的便利框架，是探索和利用多样化 AI 资源的实用工具。",65970,"2026-04-04T01:02:03",[13,29,27],{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":15},193,"meilisearch","meilisearch\u002Fmeilisearch","Meilisearch 是一个开源的极速搜索服务，专为现代应用和网站打造，开箱即用。它能帮助开发者快速集成高质量的搜索功能，无需复杂的配置或额外的数据预处理。传统搜索方案往往需要大量调优才能实现准确结果，而 Meilisearch 内置了拼写容错、同义词识别、即时响应等实用特性，并支持 AI 驱动的混合搜索（结合关键词与语义理解），显著提升用户查找信息的体验。\n\nMeilisearch 特别适合 Web 开发者、产品团队或初创公司使用，尤其适用于需要快速上线搜索功能的场景，如电商网站、内容平台或 SaaS 应用。它提供简洁的 RESTful API 和多种语言 SDK，部署简单，资源占用低，本地开发或生产环境均可轻松运行。对于希望在不依赖大型云服务的前提下，为用户提供流畅、智能搜索体验的团队来说，Meilisearch 是一个高效且友好的选择。",57019,"2026-04-08T10:53:37",[24,27,25,14,13,28],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":75,"owner_name":75,"owner_avatar_url":76,"owner_bio":77,"owner_company":77,"owner_location":78,"owner_email":79,"owner_twitter":77,"owner_website":77,"owner_url":80,"languages":81,"stars":86,"forks":87,"last_commit_at":88,"license":89,"difficulty_score":10,"env_os":90,"env_gpu":90,"env_ram":90,"env_deps":91,"category_tags":97,"github_topics":98,"view_count":10,"oss_zip_url":77,"oss_zip_packed_at":77,"status":15,"created_at":109,"updated_at":110,"faqs":111,"releases":127},5587,"Yvictor\u002FTradingGym","TradingGym","Trading and Backtesting environment for training reinforcement learning agent or simple rule base algo.","TradingGym 是一个专为金融交易设计的开源工具包，旨在为强化学习算法和规则策略提供高效的训练与回测环境。它深受 OpenAI Gym 启发，采用了标准化的交互框架，让开发者能够轻松构建、测试并优化自动交易智能体。\n\n在量化交易领域，复现真实市场动态并验证策略有效性往往充满挑战。TradingGym 通过模拟真实的订单簿数据（如买卖价差、成交量等），解决了从数据预处理到策略评估的全流程痛点。它不仅支持高频的 Tick 数据，也兼容传统的 OHLC（开高低收）格式，允许用户自定义手续费、最大持仓等关键参数，从而在接近实盘的环境中进行低成本试错。\n\n这款工具特别适合量化研究员、AI 开发者以及希望探索强化学习在金融领域应用的学生使用。其独特的技术亮点在于灵活的数据接口设计，能够处理包含买一卖一价格及成交量的复杂特征，并内置了可视化渲染功能，直观展示交易过程。虽然部分高级深度学习模型（如 A3C、DQN）的示例仍在完善中，但其核心架构已足够支撑用户加载自定义代理进行策略回测，是连接理论算法与实战交易的有力桥梁。","# TradingGym\n\n[![Build Status](https:\u002F\u002Ftravis-ci.org\u002FYvictor\u002FTradingGym.svg?branch=master)](https:\u002F\u002Ftravis-ci.org\u002FYvictor\u002FTradingGym)\n\nTradingGym is a toolkit for training and backtesting the reinforcement learning algorithms. This was inspired by OpenAI Gym and imitated the framework form. Not only traning env but also has backtesting and in the future will implement realtime trading env with Interactivate Broker API and so on.\n\nThis training env originally design for tickdata, but also support for ohlc data format. WIP.\n\n### Installation\n```\ngit clone https:\u002F\u002Fgithub.com\u002FYvictor\u002FTradingGym.git\ncd TradingGym\npython setup.py install\n```\n\n### Getting Started\n``` python\nimport random\nimport numpy as np\nimport pandas as pd\nimport trading_env\n\ndf = pd.read_hdf('dataset\u002FSGXTW.h5', 'STW')\n\nenv = trading_env.make(env_id='training_v1', obs_data_len=256, step_len=128,\n                       df=df, fee=0.1, max_position=5, deal_col_name='Price', \n                       feature_names=['Price', 'Volume', \n                                      'Ask_price','Bid_price', \n                                      'Ask_deal_vol','Bid_deal_vol',\n                                      'Bid\u002FAsk_deal', 'Updown'])\n\nenv.reset()\nenv.render()\n\nstate, reward, done, info = env.step(random.randrange(3))\n\n### randow choice action and show the transaction detail\nfor i in range(500):\n    print(i)\n    state, reward, done, info = env.step(random.randrange(3))\n    print(state, reward)\n    env.render()\n    if done:\n        break\nenv.transaction_details\n```\n- obs_data_len: observation data length\n- step_len: when call step rolling windows will + step_len\n- df exmaple\n>|index|datetime|bid|ask|price|volume|serial_number|dealin|\n>|-----|--------|---|---|-----|------|-------------|------|\n>|0|2010-05-25 08:45:00|7188.0|7188.0|7188.0|527.0|0.0|0.0|\n>|1|2010-05-25 08:45:00|7188.0|7189.0|7189.0|1.0|1.0|1.0|\n>|2|2010-05-25 08:45:00|7188.0|7189.0|7188.0|1.0|2.0|-1.0|\n>|3|2010-05-25 08:45:00|7188.0|7189.0|7188.0|4.0|3.0|-1.0|\n>|4|2010-05-25 08:45:00|7188.0|7189.0|7188.0|2.0|4.0|-1.0|\n\n- df: dataframe that contain data for trading \n> serial_number -> serial num of deal at each day recalculating\n\n- fee: when each deal will pay the fee, set with your product. \n- max_position: the max market position for you trading share.\n- deal_col_name: the column name for cucalate reward used.\n- feature_names: list contain the feature columns to use in trading status.\n\n![gif](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FYvictor_TradingGym_readme_568fd654cea5.gif)\n\n### Training\n\n#### simple dqn\n- WIP\n#### policy gradient\n- WIP\n#### actor-critic\n- WIP\n#### A3C with RNN\n- WIP\n\n### Backtesting\n\n - loading env just like training\n``` python\nenv = trading_env.make(env_id='backtest_v1', obs_data_len=1024, step_len=512,\n                       df=df, fee=0.1, max_position=5, deal_col_name='Price', \n                        feature_names=['Price', 'Volume', \n                                       'Ask_price','Bid_price', \n                                       'Ask_deal_vol','Bid_deal_vol',\n                                       'Bid\u002FAsk_deal', 'Updown'])\n```\n- load your own agent\n\n``` python \nclass YourAgent:\n    def __init__(self):\n        # build your network and so on\n        pass\n    def choice_action(self, state):\n        ## your rule base conditon or your max Qvalue action or Policy Gradient action\n         # action=0 -> do nothing\n         # action=1 -> buy 1 share\n         # action=2 -> sell 1 share\n        ## in this testing case we just build a simple random policy \n        return np.random.randint(3)\n```\n- start to backtest\n``` python\nagent = YourAgent()\n\ntransactions = []\nwhile not env.backtest_done:\n    state = env.backtest()\n    done = False\n    while not done:\n        state, reward, done, info = env.step(agent.choice_action(state))\n        #print(state, reward)\n        #env.render()\n        if done:\n            transactions.append(info)\n            break\ntransaction = pd.concate(transactions)\ntransaction\n```\n\n\u003Cdiv>\n\u003Ctable border=\"1\" class=\"dataframe\">\n  \u003Cthead>\n    \u003Ctr style=\"text-align: right;\">\n      \u003Cth>\u003C\u002Fth>\n      \u003Cth>step\u003C\u002Fth>\n      \u003Cth>datetime\u003C\u002Fth>\n      \u003Cth>transact\u003C\u002Fth>\n      \u003Cth>transact_type\u003C\u002Fth>\n      \u003Cth>price\u003C\u002Fth>\n      \u003Cth>share\u003C\u002Fth>\n      \u003Cth>price_mean\u003C\u002Fth>\n      \u003Cth>position\u003C\u002Fth>\n      \u003Cth>reward_fluc\u003C\u002Fth>\n      \u003Cth>reward\u003C\u002Fth>\n      \u003Cth>reward_sum\u003C\u002Fth>\n      \u003Cth>color\u003C\u002Fth>\n      \u003Cth>rotation\u003C\u002Fth>\n    \u003C\u002Ftr>\n  \u003C\u002Fthead>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Cth>2\u003C\u002Fth>\n      \u003Ctd>1537\u003C\u002Ftd>\n      \u003Ctd>2013-04-09 10:58:45\u003C\u002Ftd>\n      \u003Ctd>Buy\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>277.1\u003C\u002Ftd>\n      \u003Ctd>1.0\u003C\u002Ftd>\n      \u003Ctd>277.100000\u003C\u002Ftd>\n      \u003Ctd>1.0\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>0.000000\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>5\u003C\u002Fth>\n      \u003Ctd>3073\u003C\u002Ftd>\n      \u003Ctd>2013-04-09 11:47:26\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>cover\u003C\u002Ftd>\n      \u003Ctd>276.8\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>277.100000\u003C\u002Ftd>\n      \u003Ctd>0.0\u003C\u002Ftd>\n      \u003Ctd>-4.000000e-01\u003C\u002Ftd>\n      \u003Ctd>-4.000000e-01\u003C\u002Ftd>\n      \u003Ctd>-0.400000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>10\u003C\u002Fth>\n      \u003Ctd>5633\u003C\u002Ftd>\n      \u003Ctd>2013-04-09 13:23:40\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>276.9\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>276.900000\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>-0.400000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>11\u003C\u002Fth>\n      \u003Ctd>6145\u003C\u002Ftd>\n      \u003Ctd>2013-04-09 13:30:36\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>276.7\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>276.800000\u003C\u002Ftd>\n      \u003Ctd>-2.0\u003C\u002Ftd>\n      \u003Ctd>1.000000e-01\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>-0.400000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>...\u003C\u002Fth>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>211\u003C\u002Fth>\n      \u003Ctd>108545\u003C\u002Ftd>\n      \u003Ctd>2013-04-19 13:18:32\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>286.7\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>286.525000\u003C\u002Ftd>\n      \u003Ctd>-2.0\u003C\u002Ftd>\n      \u003Ctd>-4.500000e-01\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>30.650000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>216\u003C\u002Fth>\n      \u003Ctd>111105\u003C\u002Ftd>\n      \u003Ctd>2013-04-19 16:02:01\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>289.2\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>287.416667\u003C\u002Ftd>\n      \u003Ctd>-3.0\u003C\u002Ftd>\n      \u003Ctd>-5.550000e+00\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>30.650000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>217\u003C\u002Fth>\n      \u003Ctd>111617\u003C\u002Ftd>\n      \u003Ctd>2013-04-19 17:54:29\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>289.2\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>287.862500\u003C\u002Ftd>\n      \u003Ctd>-4.0\u003C\u002Ftd>\n      \u003Ctd>-5.650000e+00\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>30.650000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>218\u003C\u002Fth>\n      \u003Ctd>112129\u003C\u002Ftd>\n      \u003Ctd>2013-04-19 21:36:21\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>288.0\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>287.890000\u003C\u002Ftd>\n      \u003Ctd>-5.0\u003C\u002Ftd>\n      \u003Ctd>-9.500000e-01\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>30.650000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>219\u003C\u002Fth>\n      \u003Ctd>112129\u003C\u002Ftd>\n      \u003Ctd>2013-04-19 21:36:21\u003C\u002Ftd>\n      \u003Ctd>Buy\u003C\u002Ftd>\n      \u003Ctd>cover\u003C\u002Ftd>\n      \u003Ctd>288.0\u003C\u002Ftd>\n      \u003Ctd>5.0\u003C\u002Ftd>\n      \u003Ctd>287.890000\u003C\u002Ftd>\n      \u003Ctd>0.0\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>-1.050000e+00\u003C\u002Ftd>\n      \u003Ctd>29.600000\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>128 rows × 13 columns\u003C\u002Fp>\n\u003C\u002Fdiv>\n\n\n\n#### exmaple of rule base usage\n- ma crossover and crossunder\n\n``` python\nenv = trading_env.make(env_id='backtest_v1', obs_data_len=10, step_len=1,\n                       df=df, fee=0.1, max_position=5, deal_col_name='Price', \n                       feature_names=['Price', 'MA'])\nclass MaAgent:\n    def __init__(self):\n        pass\n        \n    def choice_action(self, state):\n        if state[-1][0] > state[-1][1] and state[-2][0] \u003C= state[-2][1]:\n            return 1\n        elif state[-1][0] \u003C state[-1][1] and state[-2][0] >= state[-2][1]:\n            return 2\n        else:\n            return 0\n# then same as above\n```\n\n\n\n\n\n","# TradingGym\n\n[![构建状态](https:\u002F\u002Ftravis-ci.org\u002FYvictor\u002FTradingGym.svg?branch=master)](https:\u002F\u002Ftravis-ci.org\u002FYvictor\u002FTradingGym)\n\nTradingGym 是一个用于训练和回测强化学习算法的工具包。它受到 OpenAI Gym 的启发，并模仿了其框架结构。除了训练环境之外，还提供了回测功能，未来还将通过 Interactive Brokers API 等接口实现实时交易环境。\n\n该训练环境最初是为分笔数据设计的，但也支持 OHLC 数据格式。目前仍在开发中。\n\n### 安装\n```\ngit clone https:\u002F\u002Fgithub.com\u002FYvictor\u002FTradingGym.git\ncd TradingGym\npython setup.py install\n```\n\n### 快速入门\n``` python\nimport random\nimport numpy as np\nimport pandas as pd\nimport trading_env\n\ndf = pd.read_hdf('dataset\u002FSGXTW.h5', 'STW')\n\nenv = trading_env.make(env_id='training_v1', obs_data_len=256, step_len=128,\n                       df=df, fee=0.1, max_position=5, deal_col_name='Price', \n                       feature_names=['Price', 'Volume', \n                                      'Ask_price','Bid_price', \n                                      'Ask_deal_vol','Bid_deal_vol',\n                                      'Bid\u002FAsk_deal', 'Updown'])\n\nenv.reset()\nenv.render()\n\nstate, reward, done, info = env.step(random.randrange(3))\n\n### 随机选择动作并显示交易详情\nfor i in range(500):\n    print(i)\n    state, reward, done, info = env.step(random.randrange(3))\n    print(state, reward)\n    env.render()\n    if done:\n        break\nenv.transaction_details\n```\n- obs_data_len: 观测数据长度\n- step_len: 调用 step 时，滑动窗口会增加 step_len\n- df 示例\n>|index|datetime|bid|ask|price|volume|serial_number|dealin|\n>|-----|--------|---|---|-----|------|-------------|------|\n>|0|2010-05-25 08:45:00|7188.0|7188.0|7188.0|527.0|0.0|0.0|\n>|1|2010-05-25 08:45:00|7188.0|7189.0|7189.0|1.0|1.0|1.0|\n>|2|2010-05-25 08:45:00|7188.0|7189.0|7188.0|1.0|2.0|-1.0|\n>|3|2010-05-25 08:45:00|7188.0|7189.0|7188.0|4.0|3.0|-1.0|\n>|4|2010-05-25 08:45:00|7188.0|7189.0|7188.0|2.0|4.0|-1.0|\n\n- df: 包含交易数据的 DataFrame\n> serial_number -> 每日重新计算的成交序号\n\n- fee: 每笔交易需支付的手续费，根据您的产品设置。\n- max_position: 您可持有的最大市场头寸数量。\n- deal_col_name: 用于计算奖励的列名。\n- feature_names: 用于交易状态的特征列列表。\n\n![gif](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FYvictor_TradingGym_readme_568fd654cea5.gif)\n\n### 训练\n\n#### 简单 DQN\n- 开发中\n#### 策略梯度\n- 开发中\n#### 策略-价值网络（Actor-Critic）\n- 开发中\n#### 带 RNN 的 A3C\n- 开发中\n\n### 回测\n\n - 加载与训练时相同的环境\n``` python\nenv = trading_env.make(env_id='backtest_v1', obs_data_len=1024, step_len=512,\n                       df=df, fee=0.1, max_position=5, deal_col_name='Price', \n                        feature_names=['Price', 'Volume', \n                                       'Ask_price','Bid_price', \n                                       'Ask_deal_vol','Bid_deal_vol',\n                                       'Bid\u002FAsk_deal', 'Updown'])\n```\n- 加载您自己的智能体\n\n``` python \nclass YourAgent:\n    def __init__(self):\n        # 构建您的网络等\n        pass\n    def choice_action(self, state):\n        ## 您的规则条件、最大Q值动作或策略梯度动作\n         # action=0 -> 不做任何操作\n         # action=1 -> 买入1股\n         # action=2 -> 卖出1股\n        ## 在这个测试案例中，我们只构建了一个简单的随机策略 \n        return np.random.randint(3)\n```\n- 开始回测\n``` python\nagent = YourAgent()\n\ntransactions = []\nwhile not env.backtest_done:\n    state = env.backtest()\n    done = False\n    while not done:\n        state, reward, done, info = env.step(agent.choice_action(state))\n        #print(state, reward)\n        #env.render()\n        if done:\n            transactions.append(info)\n            break\ntransaction = pd.concate(transactions)\ntransaction\n```\n\n\u003Cdiv>\n\u003Ctable border=\"1\" class=\"dataframe\">\n  \u003Cthead>\n    \u003Ctr style=\"text-align: right;\">\n      \u003Cth>\u003C\u002Fth>\n      \u003Cth>step\u003C\u002Fth>\n      \u003Cth>datetime\u003C\u002Fth>\n      \u003Cth>transact\u003C\u002Fth>\n      \u003Cth>transact_type\u003C\u002Fth>\n      \u003Cth>price\u003C\u002Fth>\n      \u003Cth>share\u003C\u002Fth>\n      \u003Cth>price_mean\u003C\u002Fth>\n      \u003Cth>position\u003C\u002Fth>\n      \u003Cth>reward_fluc\u003C\u002Fth>\n      \u003Cth>reward\u003C\u002Fth>\n      \u003Cth>reward_sum\u003C\u002Fth>\n      \u003Cth>color\u003C\u002Fth>\n      \u003Cth>rotation\u003C\u002Fth>\n    \u003C\u002Ftr>\n  \u003C\u002Fthead>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Cth>2\u003C\u002Fth>\n      \u003Ctd>1537\u003C\u002Ftd>\n      \u003Ctd>2013-04-09 10:58:45\u003C\u002Ftd>\n      \u003Ctd>Buy\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>277.1\u003C\u002Ftd>\n      \u003Ctd>1.0\u003C\u002Ftd>\n      \u003Ctd>277.100000\u003C\u002Ftd>\n      \u003Ctd>1.0\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>0.000000\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>5\u003C\u002Fth>\n      \u003Ctd>3073\u003C\u002Ftd>\n      \u003Ctd>2013-04-09 11:47:26\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>cover\u003C\u002Ftd>\n      \u003Ctd>276.8\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>277.100000\u003C\u002Ftd>\n      \u003Ctd>0.0\u003C\u002Ftd>\n      \u003Ctd>-4.000000e-01\u003C\u002Ftd>\n      \u003Ctd>-4.000000e-01\u003C\u002Ftd>\n      \u003Ctd>-0.400000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>10\u003C\u002Fth>\n      \u003Ctd>5633\u003C\u002Ftd>\n      \u003Ctd>2013-04-09 13:23:40\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>276.9\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>276.900000\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>-0.400000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>11\u003C\u002Fth>\n      \u003Ctd>6145\u003C\u002Ftd>\n      \u003Ctd>2013-04-09 13:30:36\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>276.7\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>276.800000\u003C\u002Ftd>\n      \u003Ctd>-2.0\u003C\u002Ftd>\n      \u003Ctd>1.000000e-01\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>-0.400000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>...\u003C\u002Fth>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>211\u003C\u002Fth>\n      \u003Ctd>108545\u003C\u002Ftd>\n      \u003Ctd>2013-04-19 13:18:32\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>286.7\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>286.525000\u003C\u002Ftd>\n      \u003Ctd>-2.0\u003C\u002Ftd>\n      \u003Ctd>-4.500000e-01\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>30.650000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>216\u003C\u002Fth>\n      \u003Ctd>111105\u003C\u002Ftd>\n      \u003Ctd>2013-04-19 16:02:01\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>289.2\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>287.416667\u003C\u002Ftd>\n      \u003Ctd>-3.0\u003C\u002Ftd>\n      \u003Ctd>-5.550000e+00\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>30.650000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>217\u003C\u002Fth>\n      \u003Ctd>111617\u003C\u002Ftd>\n      \u003Ctd>2013-04-19 17:54:29\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>289.2\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>287.862500\u003C\u002Ftd>\n      \u003Ctd>-4.0\u003C\u002Ftd>\n      \u003Ctd>-5.650000e+00\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>30.650000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>218\u003C\u002Fth>\n      \u003Ctd>112129\u003C\u002Ftd>\n      \u003Ctd>2013-04-19 21:36:21\u003C\u002Ftd>\n      \u003Ctd>Sell\u003C\u002Ftd>\n      \u003Ctd>new\u003C\u002Ftd>\n      \u003Ctd>288.0\u003C\u002Ftd>\n      \u003Ctd>-1.0\u003C\u002Ftd>\n      \u003Ctd>287.890000\u003C\u002Ftd>\n      \u003Ctd>-5.0\u003C\u002Ftd>\n      \u003Ctd>-9.500000e-01\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>30.650000\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>219\u003C\u002Fth>\n      \u003Ctd>112129\u003C\u002Ftd>\n      \u003Ctd>2013-04-19 21:36:21\u003C\u002Ftd>\n      \u003Ctd>Buy\u003C\u002Ftd>\n      \u003Ctd>cover\u003C\u002Ftd>\n      \u003Ctd>288.0\u003C\u002Ftd>\n      \u003Ctd>5.0\u003C\u002Ftd>\n      \u003Ctd>287.890000\u003C\u002Ftd>\n      \u003Ctd>0.0\u003C\u002Ftd>\n      \u003Ctd>0.000000e+00\u003C\u002Ftd>\n      \u003Ctd>-1.050000e+00\u003C\u002Ftd>\n      \u003Ctd>29.600000\u003C\u002Ftd>\n      \u003Ctd>1\u003C\u002Ftd>\n      \u003Ctd>2\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>128 rows × 13 columns\u003C\u002Fp>\n\u003C\u002Fdiv>\n\n\n\n#### 规则基础使用的示例\n- 移动平均线交叉与反向交叉\n\n``` python\nenv = trading_env.make(env_id='backtest_v1', obs_data_len=10, step_len=1,\n                       df=df, fee=0.1, max_position=5, deal_col_name='Price', \n                       feature_names=['Price', 'MA'])\nclass MaAgent:\n    def __init__(self):\n        pass\n        \n    def choice_action(self, state):\n        if state[-1][0] > state[-1][1] and state[-2][0] \u003C= state[-2][1]:\n            return 1\n        elif state[-1][0] \u003C state[-1][1] and state[-2][0] >= state[-2][1]:\n            return 2\n        else:\n            return 0\n# 然后同上\n```","# TradingGym 快速上手指南\n\nTradingGym 是一个用于训练和回测强化学习交易算法的工具包。它受 OpenAI Gym 启发，不仅支持训练环境，还提供回测功能，并计划未来支持实时交易。该工具最初为 Tick 数据设计，同时也支持 OHLC（开高低收）数据格式。\n\n## 环境准备\n\n*   **系统要求**: Linux, macOS 或 Windows (需配置 Python 环境)\n*   **前置依赖**:\n    *   Python 3.x\n    *   NumPy\n    *   Pandas\n    *   Git\n*   **数据格式**: 需要准备包含交易数据的 DataFrame (支持 `.h5` 或其他 Pandas 可读格式)，列名需包含价格、成交量等特征。\n\n## 安装步骤\n\n通过 Git 克隆仓库并使用 `setup.py` 进行安装：\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FYvictor\u002FTradingGym.git\ncd TradingGym\npython setup.py install\n```\n\n> **提示**: 如果下载速度较慢，可尝试使用国内镜像加速 Git 克隆，或在安装依赖时使用清华\u002F阿里 pip 源：\n> `pip install -r requirements.txt -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple` (如有 requirements 文件)\n\n## 基本使用\n\n以下示例展示如何加载数据、初始化交易环境、执行随机动作并查看回测结果。\n\n### 1. 初始化环境与单步测试\n\n```python\nimport random\nimport numpy as np\nimport pandas as pd\nimport trading_env\n\n# 加载数据 (示例使用 HDF5 格式)\ndf = pd.read_hdf('dataset\u002FSGXTW.h5', 'STW')\n\n# 创建训练环境\nenv = trading_env.make(env_id='training_v1', obs_data_len=256, step_len=128,\n                       df=df, fee=0.1, max_position=5, deal_col_name='Price', \n                       feature_names=['Price', 'Volume', \n                                      'Ask_price','Bid_price', \n                                      'Ask_deal_vol','Bid_deal_vol',\n                                      'Bid\u002FAsk_deal', 'Updown'])\n\n# 重置环境并渲染\nenv.reset()\nenv.render()\n\n# 执行一步随机动作 (0: 不动，1: 买入，2: 卖出)\nstate, reward, done, info = env.step(random.randrange(3))\n```\n\n**关键参数说明：**\n*   `obs_data_len`: 观察数据的长度（时间窗口）。\n*   `step_len`: 每次调用 `step` 时滚动窗口前进的步长。\n*   `fee`: 单次交易的手续费比例。\n*   `max_position`: 最大持仓数量。\n*   `feature_names`: 用于构建交易状态的特征列名列表。\n\n### 2. 运行回测循环\n\n模拟完整的回测过程并记录交易详情：\n\n```python\n# 重置环境\nenv.reset()\n\n# 模拟 500 步随机交易\nfor i in range(500):\n    print(f\"Step: {i}\")\n    # 随机选择动作\n    state, reward, done, info = env.step(random.randrange(3))\n    print(f\"State: {state}, Reward: {reward}\")\n    \n    # 可视化渲染 (可选)\n    env.render()\n    \n    if done:\n        break\n\n# 查看详细的交易记录\nprint(env.transaction_details)\n```\n\n### 3. 自定义策略代理 (Agent)\n\n你可以编写自己的策略类来替代随机动作，例如基于均线的简单规则：\n\n```python\nclass MaAgent:\n    def __init__(self):\n        pass\n        \n    def choice_action(self, state):\n        # state 是一个二维数组，假设最后两列是价格和 MA\n        # 金叉买入：当前价格 > MA 且 前一时刻价格 \u003C= 前一时刻 MA\n        if state[-1][0] > state[-1][1] and state[-2][0] \u003C= state[-2][1]:\n            return 1 # Buy\n        # 死叉卖出：当前价格 \u003C MA 且 前一时刻价格 >= 前一时刻 MA\n        elif state[-1][0] \u003C state[-1][1] and state[-2][0] >= state[-2][1]:\n            return 2 # Sell\n        else:\n            return 0 # Hold\n\n# 使用自定义 Agent 进行回测\nagent = MaAgent()\ntransactions = []\n\n# 注意：实际回测流程可能需要根据具体版本调整循环逻辑\n# 以下为概念示例\nwhile not env.backtest_done: \n    state = env.backtest() # 获取初始状态\n    done = False\n    while not done:\n        action = agent.choice_action(state)\n        state, reward, done, info = env.step(action)\n        if done:\n            transactions.append(info)\n            break\n\ntransaction_df = pd.concat(transactions)\nprint(transaction_df)\n```","某量化团队正在研发基于高频 Tick 数据的做市策略，急需验证强化学习模型在真实市场摩擦下的表现。\n\n### 没有 TradingGym 时\n- **环境搭建繁琐**：开发者需从零编写代码来模拟订单簿、处理买卖价差及滑点，难以复现真实的微观市场结构。\n- **回测与训练割裂**：训练用的仿真环境与实盘回测逻辑不一致，导致模型在训练时表现优异，一旦上线便因环境差异而失效。\n- **数据格式适配难**：原始 Tick 数据包含复杂的买卖盘口信息，手动将其转化为适合强化学习的状态空间（State Space）极易出错且耗时。\n- **交易细节不透明**：缺乏内置的交易记录追踪机制，难以复盘每一笔成交的手续费扣除、持仓变化及具体盈亏来源。\n\n### 使用 TradingGym 后\n- **开箱即用的仿真**：直接加载包含 Bid\u002FAsk 价量的 DataFrame，TradingGym 自动构建符合 OpenAI Gym 标准的交易环境，原生支持手续费和最大持仓限制。\n- **训测一体化框架**：同一套环境配置既可用于 DQN、A3C 等算法的训练，也可无缝切换至回测模式，确保策略逻辑在不同阶段的高度一致性。\n- **灵活的状态定义**：通过 `feature_names` 参数即可轻松指定输入特征（如买卖成交量、涨跌方向），自动处理滚动窗口数据，大幅降低预处理门槛。\n- **详尽的成交归因**：执行结束后直接输出 `transaction_details`，清晰展示每一步的动作奖励、持仓状态及详细流水，便于快速迭代优化。\n\nTradingGym 通过统一训练与回测的高保真环境，让量化开发者能专注于策略逻辑本身，显著缩短了从算法构思到实盘验证的周期。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FYvictor_TradingGym_568fd654.gif","Yvictor","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002FYvictor_27e54d11.png",null,"Taiwan","yvictor3141@gmail.com","https:\u002F\u002Fgithub.com\u002FYvictor",[82],{"name":83,"color":84,"percentage":85},"Python","#3572A5",100,1862,370,"2026-04-07T11:03:27","MIT","未说明",{"notes":92,"python":90,"dependencies":93},"该工具主要用于强化学习交易训练和回测，支持 Tick 数据和 OHLC 数据格式。安装方式为克隆仓库后运行 'python setup.py install'。README 中提到的深度学习算法（如 DQN, A3C 等）标记为 'WIP'（开发中），因此当前主要依赖基础数据科学库。示例代码显示需要读取 HDF5 格式的数据集。",[94,95,96],"numpy","pandas","trading_env",[13],[99,100,101,102,103,104,105,106,107,108],"trading","python","reinforcement-learning","trading-bot","trading-platform","trading-simulator","trading-strategies","trading-api","backtesting-trading-strategies","backtest","2026-03-27T02:49:30.150509","2026-04-09T00:49:35.652964",[112,117,122],{"id":113,"question_zh":114,"answer_zh":115,"source_url":116},25352,"代码中 step_len 是否在检查长度时被重复添加了？","代码逻辑是正确的。step_st 代表状态数组中的当前索引或步数，而 step_len 仅代表迭代时跳跃的步数数量，两者相加符合预期逻辑，无需修改。","https:\u002F\u002Fgithub.com\u002FYvictor\u002FTradingGym\u002Fissues\u002F13",{"id":118,"question_zh":119,"answer_zh":120,"source_url":121},25350,"遇到 'trading_env' object has no attribute 'backtest' 错误该怎么办？","需要在 backtest_v1.py 文件中手动添加一个名为 \"backtest\" 的函数。这是一个已知问题，多位用户遇到过相同情况。","https:\u002F\u002Fgithub.com\u002FYvictor\u002FTradingGym\u002Fissues\u002F6",{"id":123,"question_zh":124,"answer_zh":125,"source_url":126},25351,"找不到数据集文件 'dataset\u002FSGXTW.h5' 导致报错怎么办？","请使用项目提供的示例数据文件 'SGXTWsample.h5' 代替，或者使用您自己的数据集进行训练。由于新加坡交易所（SGX）的法律限制，维护者无法分享完整的数据集。","https:\u002F\u002Fgithub.com\u002FYvictor\u002FTradingGym\u002Fissues\u002F3",[]]