AI量化交易入门指南:Python策略开发与回测实战全解析
AI 这阵风刮到量化交易圈之后最直观的变化就是过去需要一整个投研团队才能干的事现在一个人加几台服务器就能搭出完整的研究框架。我自己从纯手工盯盘熬到写策略、跑回测、上线自动化交易这几年最大的感受就是——量化不再是华尔街的专属玩具而 AI 的介入更是把门槛往下拽了一大截。这篇内容不是劝你冲进去梭哈而是把“AI 量化”这条路上真实的技术环节、工具选型和踩坑经历掰开揉碎讲清楚尤其是 Python 策略代码、数据源选择、模型评估这几个最容易卡住新人的地方。无论你是刚接触量化的小白还是已经在手工交易里摸爬滚打多年的老手这篇文章都能给你一条可以照着走的路线。1. AI与量化交易为什么会撞出火花1.1 量化交易把投资规则变成代码量化交易说白了就是“用数学模型代替情绪做决策”。传统交易员看盘靠经验和盘感量化交易者则是把“什么条件下买、什么条件下卖、仓位多大、风险怎么控”这些规则全部翻译成代码让程序按照既定逻辑执行。这样做的好处有三个一是速度快机器在毫秒级别就能完成行情解析和下单指令二是纪律性强不会因为恐惧或贪婪临时改主意三是可回溯每一笔决策都能被历史数据反复验证。但纯规则型的量化策略有个天花板规则是人写出来的人的认知有限。比如双均线金叉买入、死叉卖出这种策略在趋势明显的行情里很有效可一旦市场进入震荡就会被反复打脸。这时候就需要 AI 上场了——让模型在海量历史数据里自己找规律而不是靠人肉去猜。1.2 AI给量化带来的四个关键变化第一特征工程从“手工”变成了“半自动”。以前做量化研究需要手动计算各种技术指标、基本面因子然后一列一列地试。现在的做法是让模型直接从原始行情数据里提取特征像深度学习里的卷积网络甚至能自动识别 K 线形态省掉了大量人工筛选的时间。第二模型能力从“线性判断”升级到“非线性拟合”。股票价格的变化受宏观、行业、资金、情绪等多重因素影响彼此之间是高度非线性的关系。传统线性回归很难捕捉这种复杂联动而随机森林、XGBoost、神经网络这类模型天然擅长处理非线性关系。第三算力和数据获取成本大幅下降。十年前做量化一个像样的数据终端一年就要几十万现在开源数据、免费 API 遍地都是一块消费级显卡就能跑小规模的训练任务云计算按小时计费更是把算力成本打到了几乎人人都能承担的水平。第四开源生态让“重复造轮子”成为过去式。从数据获取akshare、tushare、yfinance、回测框架backtrader、vectorbt、zipline到机器学习库scikit-learn、PyTorch、TensorFlow全链路都有现成的轮子。你要做的不是从零写而是把合适的组件拼起来。1.3 什么样的人适合赶上这波浪潮先说结论不是所有人都适合。你在 AI 量化里能走多远取决于三个基础——编程能力、概率统计功底、对市场的敬畏心。如果你连 Python 基础语法都要查半天那就先别碰模型老老实实把 pandas 和 numpy 用熟再谈策略如果你只会调库而不理解交叉验证、过拟合这些概念那模型跑出来的漂亮曲线大概率是自欺欺人。反过来讲这波“大淘金时代”确实给两类人开了绿灯。一类是程序员转金融码代码的能力天然占优缺的是金融常识和数据敏感度另一类是金融从业者转技术懂业务逻辑但编程薄弱需要补工程能力。我见过不少成功案例都是从最简单的“一条均线 一个买卖逻辑”开始慢慢加上机器学习模型逐步迭代出来的。别贪大求全先在一个极小的策略上完整地走通“数据—回测—上线”流程比什么都重要。2. 核心工具选型与部署配置2.1 从零搭建AI量化环境工欲善其事必先利其器。这里我给出一套经过实测的“低成本高性价比”组合选型逻辑是优先开源、免费迁移成本低社区活跃。Python 3.10做量化首选语言没有之一。金融计算库、机器学习库、回测框架都是围绕 Python 生态生长的。Anaconda 或 Miniconda环境管理工具解决包版本冲突。强烈建议用 conda 创建独立环境不然 pip 装包会装到怀疑人生。Jupyter Notebook / VS Code交互式研究用 Notebook 最顺手一段段跑数据看结果写正式工程代码用 VS Code配合调试功能效率高。数据库小规模研究用 SQLite 或 Parquet 文件就够数据量大再上 PostgreSQL 或 ClickHouse。装完基础环境后核心依赖用一行命令搞定pip install pandas numpy matplotlib scikit-learn xgboost lightgbm pip install backtrader akshare tushare装好之后务必跑一遍版本检查我踩过的坑是 pandas 版本升级后 API 变了老策略代码一执行直接抛异常。建议写完 requirements.txt 锁版本方便以后复现。2.2 数据源怎么选量化策略的地基是数据数据不对再牛的模型也白搭。市面上的数据源大致分三类开源免费型、商业付费型、自采型。数据源类型优势劣势akshare开源免费接口丰富覆盖股票、期货、基金、宏观数据数据质量偶有瑕疵需要自己做清洗tushare开源积分分级历史数据较全社区文档完善高频/高等级接口需要付费积分yfinance开源免费覆盖全球市场适合美股/加密研究数据源不稳定偶尔拉取失败Wind/同花顺 iFinD商业付费数据质量高接口规范价格高昂个人用户不划算个人做研究的话我建议先用 akshare 免费接口把流程跑通等确定策略方向后再考虑采购高质量数据。有一点必须提醒免费数据普遍存在复权不完整的问题尤其是分红配股这类事件会影响计算收益率的准确性。我的经验是优先使用“后复权”数据进行策略回测避免前复权数据动态变化导致的历史数据被篡改感。2.3 模型框架的选择传统机器学习还是深度学习很多新手一上来就想上 LSTM、Transformer觉得越深的网络越高级。其实在量化领域传统机器学习模型往往比深度学习更实用原因主要有三个样本量不够、信噪比太低、训练成本失控。A 股几千只股票日线数据一天一根 K 线积累十年的有效样本也才两千多个这点数据量根本喂不饱深度网络。我个人的选型经验是分场景处理因子挖掘、涨跌分类优先 XGBoost 和 LightGBM训练快、调参相对容易、效果稳定。这类 GBDT 模型对表格型数据有天然优势。时序预测、序列特征提取可以考虑 LSTM、TCN但必须配合充足的数据和严格的正则化手段。强化学习用于仓位管理这个门槛最高适合进阶玩家。策略的动作空间和奖励函数设计一旦不合理模型根本学不进去。我的习惯是先跑一个随机森林或 XGBoost 基座模型作为基准Baseline如果 GBDT 的上限都到不了稳定盈利的水平换成深度学习大概率也不会好到哪去。模型不是越复杂越好而是“够用且稳定”才是最好。3. 实操一个可落地的AI量化策略完整流程3.1 用Python实现双均线策略回测先从最经典的入门策略开始目标是跑通“取数据—算信号—回测—看结果”这条链路。下面这段代码使用 pandas 手工实现双均线策略逻辑就是短期均线上穿长期均线时全仓买入下穿时清仓卖出。import akshare as ak import pandas as pd import numpy as np # 1. 获取历史日线数据 df ak.stock_zh_a_hist(symbol000001, perioddaily, start_date20180101, end_date20231231) df.columns [date, open, close, high, low, volume, amount, amplitude, pct_chg, chg, turnover] df[date] pd.to_datetime(df[date]) df df.set_index(date) df[close] df[close].astype(float) # 2. 计算双均线 df[ma_short] df[close].rolling(window5).mean() df[ma_long] df[close].rolling(window20).mean() # 3. 生成交易信号短期上穿长期为买入下穿为卖出 df[position] 0 df.loc[df[ma_short] df[ma_long], position] 1 df[signal] df[position].diff() # 4. 回测每日收益 仓位 * 当日收益率 df[ret] df[close].pct_change() df[strategy_ret] df[position].shift(1) * df[ret] df[strategy_ret].fillna(0, inplaceTrue) # 5. 计算累计净值 df[nav] (1 df[strategy_ret]).cumprod() print(df[[close, ma_short, ma_long, position, strategy_ret, nav]].tail(20))这段代码有几个容易被忽略的关键点。第一df[position].shift(1)必不可少。它表示用昨天的信号决定今天的仓位避免用当天的收盘价数据去预测当天收益——这在回测里叫做“未来函数”会导致回测结果虚高到离谱。第二没有计算手续费和滑点。真实交易的摩擦成本对高频策略影响极大即便是日线级别的策略也要在净值计算前扣除费用比如单边万三佣金加上印花税。别小看这笔账策略年化收益可能只有十几个点手续费就能吃掉一半。第三信号只用了“价格”这一个维度。实际做策略时可以叠加成交量、波动率、资金流向等因子用过滤条件减少假信号。比如短期均线上穿长期均线的同时要求成交量放大到 20 日均量的 1.5 倍以上信号质量会好很多。3.2 引入机器学习模型做预测双均线策略只能算“规则量化”现在把它升级成“AI 量化”。思路很直白把过去 N 天的行情特征作为输入预测未来一天的涨跌方向模型输出概率后封装成交易信号。import pandas as pd import numpy as np from sklearn.model_selection import TimeSeriesSplit from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score # 继续沿用上一节的 df 数据 df df[[close, volume, ma_short, ma_long]].copy() # 构建特征过去5天的收益率、振幅、量比、均价 for i in range(1, 6): df[fret_{i}] df[close].pct_change(i) df[amp] (df[close].rolling(5).max() - df[close].rolling(5).min()) / df[close].rolling(5).mean() df[vol_ratio] df[volume] / df[volume].rolling(20).mean() # 标签未来5天收益率是否为正 df[future_ret] df[close].shift(-5) / df[close] - 1 df[label] (df[future_ret] 0).astype(int) # 删除空值 df.dropna(inplaceTrue) # 特征与标签分离 features [ret_1, ret_2, ret_3, ret_4, ret_5, amp, vol_ratio] X df[features] y df[label] # 时序交叉验证按时间顺序切分不能用随机切分 tscv TimeSeriesSplit(n_splits5) accs [] for train_idx, test_idx in tscv.split(X): X_train, X_test X.iloc[train_idx], X.iloc[test_idx] y_train, y_test y.iloc[train_idx], y.iloc[test_idx] clf RandomForestClassifier(n_estimators200, max_depth5, random_state42) clf.fit(X_train, y_train) y_pred clf.predict(X_test) accs.append(accuracy_score(y_test, y_pred)) print(平均准确率:, np.mean(accs)) print(各折准确率:, accs)这里我特意用了TimeSeriesSplit而不是普通的train_test_split。原因很简单股票数据是强时间序列用随机打乱的方式切分会把未来数据混进训练集造成数据泄露。这种“用未来预测过去”的作弊会让验证集准确率高得吓人但实盘却一塌糊涂。另外在特征选择上我刻意控制了特征数量。很多人喜欢一股脑堆几十个因子进去表面上看训练集表现很完美实际上模型在疯狂记忆噪声。我的原则是“宁缺毋滥”每个特征都必须有解释得通的经济学逻辑比如动量、均值回归、量价配合等。3.3 策略评价指标怎么看跑完回测不能只看累计净值曲线有多漂亮那是最容易骗人的指标。一个成熟的策略评估至少要看下面这几个维度年化收益率把累计收益折算到单年。计算公式是(最终净值)^(252/交易天数) - 1其中 252 是一年的交易日数量。最大回撤统计净值从峰值跌到底部最大幅度反映极端风险。回撤 30% 意味着要涨 43% 才能回到峰值心理压力和资金压力都很大。夏普比率衡量“每承担一单位风险能换来多少超额收益”公式是(年化收益 - 无风险利率) / 年化波动率。一般大于 1 算合格大于 2 就算优秀。胜率与盈亏比胜率高不一定赚钱赢的时候赚 3 个点、输的时候亏 8 个点照样是亏钱的。两者要配合看。# 计算核心指标 daily_ret df[strategy_ret].dropna() annual_ret (1 df[nav].iloc[-1]) ** (252 / len(daily_ret)) - 1 max_drawdown (df[nav] / df[nav].cummax() - 1).min() sharpe daily_ret.mean() / daily_ret.std() * np.sqrt(252) print(f年化收益: {annual_ret:.2%}) print(f最大回撤: {max_drawdown:.2%}) print(f夏普比率: {sharpe:.2f})这套评估框架对 AI 策略同样适用。但要格外注意模型在训练集上的夏普比率没有参考价值必须以样本外测试结果为准。我见过不少策略宣传“年化 300%”一问才知道是回测数据没切干净、手续费没算、还用了未来函数这种策略上线真实结果往往惨不忍睹。4. 常见问题与排查技巧实录4.1 数据坑未来函数与幸存者偏差未来函数是回测里的头号大敌。常见的表现有两种一是用了当天的收盘价生成当天的交易信号并在同一天成交二是使用了“未来数据”计算指标比如日线级策略里混入了当日盘中才能知道的数据。解决办法就是严格遵守“信号生成时点只能用当时已经发生的数据”这一铁律代码里一定要用shift把数据平移。幸存者偏差则是另一个隐蔽陷阱。如果筛选股票池时只保留了现在还在上市的股票那么那些因为退市、暴跌而消失的股票就被“隐形”了回测结果自然被系统性高估。A 股早期退市案例少这个偏差还不算严重但在美股和币圈里非常致命。解决思路是构建股票池时使用“当时存在的全部标的”或者使用指数成分股权重来处理。4.2 模型坑过拟合与数据泄露AI 量化最容易翻车的地方就是“过拟合”模型把历史行情里的噪声当成规律记了下来。典型症状是训练集上表现完美、样本外一塌糊涂。预防手段有这么几个一是增大样本量用分钟级别数据代替日线数据二是简化模型复杂度减少树的深度和特征数量三是做严格的时序交叉验证四是把特征数量控制在样本量的十分之一以下。数据泄露则是更隐蔽的敌人。除了前面提到的随机切分还有一种情况是特征构造时用了未来窗口的信息比如用“未来 5 天均值”做特征去预测未来 5 天涨跌这就等于把答案写进了考卷。排查方法是逐个特征检查计算窗口的截止时间确保所有指标在 T 时刻只能用 T的数据计算得出。4.3 执行坑滑点和手续费回测赚钱实盘亏损很多人的第一反应是模型错了其实问题往往出在执行环节。回测假设成交价就是信号发生时的收盘价但实盘会有滑点——你看到的价格和真正成交的价格之间差了几个 tick尤其在小市值和流动性差的标的上滑点会吃掉大量利润。手续费更不能忽视。A 股卖出有印花税加上券商的佣金、过户费一次完整的买卖循环成本可能在 0.1% 以上。如果你做的是日内高频策略一天交易十几次光手续费就能把本金磨光。解决方法就是回测时加入手续费和滑点参数最粗暴的设定是一买一卖扣 0.15%再在成交价上加减 0.1% 的滑点这样回测结果才接近实盘。4.4 心态坑AI不是印钞机这是我最想强调的一点。AI 模型的本质是“概率预测器”它给出的永远是“上涨概率可能是多少”而不是“明天一定涨”。再好的策略也有连亏的时候连亏十几笔在 AI 量化里非常正常。我见过不少朋友跑出漂亮的回测曲线后信心爆棚直接上大杠杆结果市场风格一变半个月就把前一年的利润全部回吐。合理的预期管理应该是AI 量化能帮你把交易从“凭感觉”变成“有依据”能大幅提升研究效率能在某些市场状态下稳定获利但它无法保证任何形式的稳定暴富。凡是声称“AI 量化躺赚”“无风险套利”的产品反而要提高警惕。我自己在实际操作中的体会是把模型当成一个需要持续监控、定期重新训练的工具而不是一台开动就完事的印钞机。这个赛道最迷人的地方在于迭代速度。今天写好的因子三个月后可能就失效了今天训练好的模型过半年风格切换后可能就变成了反向指标。所以我的日常工作里最花时间的不是写代码而是数据监控和模型复评。如果你决定入这一行建议从一个小策略开始把回测环境搭扎实再逐步引入 AI 模型每一步都验证清晰。先活下来再谈大淘金。

相关新闻

Flutter与鸿蒙二进制编解码适配实战

Flutter与鸿蒙二进制编解码适配实战

1. 项目背景与核心价值在跨平台开发领域,Flutter因其高效的渲染性能和一致的UI体验已成为移动端开发的主流选择之一。而binary_codec作为Flutter生态中处理二进制数据编解码的关键底层库,其重要性不言而喻。随着鸿蒙系统的快速崛起,开发者面临…

2026/10/15 12:56:22 阅读更多 →
Spring框架Bean管理:从基础概念到最佳实践

Spring框架Bean管理:从基础概念到最佳实践

1. Spring框架中的Bean基础概念在Spring框架中,Bean是最核心的概念之一。简单来说,Bean就是由Spring容器管理的Java对象。与传统的new关键字创建对象不同,Spring中的Bean是由IoC容器负责实例化、配置和组装的。我第一次接触Spring时&#xff…

2026/10/15 12:56:22 阅读更多 →
前端入门必读:Web、网页与浏览器核心概念全解析

前端入门必读:Web、网页与浏览器核心概念全解析

1. 从零认识前端:Web、网页与浏览器到底是怎么回事很多人刚接触前端开发的时候,脑子里其实是一团浆糊。打开编辑器敲了几行代码,浏览器里跑出来一个页面,但你要问他“Web是什么”“网页是怎么变成你看到的样子的”“浏览器到底在背…

2026/10/15 12:56:22 阅读更多 →

最新新闻

C语言银行系统实战:消息队列实现进程间通信与并发控制

C语言银行系统实战:消息队列实现进程间通信与并发控制

前段时间我动手写了一个C语言的银行系统练手项目,功能清单看着很常规:开户、销户、存钱、取钱、转账、查询、保存用户信息。但标题里真正藏关键的是最后那句——使用消息队列达到两个不同进程之间的相互通信。这句话直接把项目的难度从“文件读写练习”拉…

2026/10/15 16:26:30 阅读更多 →
智能车摄像头图像处理:五种阈值算法选型与代码实现

智能车摄像头图像处理:五种阈值算法选型与代码实现

简介:这份资源面向参加智能车竞赛的选手及图像处理初学者,聚焦摄像头图像处理中的阈值分割环节,提供五种经典算法的C语言实现。包内共5个文件,均为.c源码,压缩包约3KB,分别对应百分比阈值法、最佳迭代法、双…

2026/10/15 16:26:30 阅读更多 →
把区域建模成服务半径参数而不是计价参数

把区域建模成服务半径参数而不是计价参数

一、问题定义:区域字段为什么会进错函数回收报价链路里有一个高频错误:把用户所在区(zone)当作计价因子传进价格函数。现象特征是同一款式、同一成色段位,仅因所在区不同而得到不同报价。这个现象在数据层面不是"…

2026/10/15 16:26:30 阅读更多 →
AI辅助创作占比怎么算、信息增量怎么看:以媒介果发稿流程为参照的审核自查指南

AI辅助创作占比怎么算、信息增量怎么看:以媒介果发稿流程为参照的审核自查指南

稿件已经发布,团队复盘时却卡在一个问题上:编辑用AI整理过资料、写手又重写了正文,这篇文章到底算多少“AI辅助创作”?如果收到“疑似AI内容偏高”的反馈,是重测一遍,还是整篇改写?做内容交付时…

2026/10/15 16:26:30 阅读更多 →
nRF52832 GCC编译环境搭建:工具链选型、Makefile调优与CI集成

nRF52832 GCC编译环境搭建:工具链选型、Makefile调优与CI集成

简介:这份资料合集面向使用Nordic nRF52832低功耗蓝牙SoC进行嵌入式开发的工程师与初学者,重点解决在Windows平台上搭建GCC交叉编译环境的问题。内容围绕gcc-arm-none-eabi工具链、MinGW环境以及Nordic专用配置展开,配合配套文章说明&#xf…

2026/10/15 16:26:30 阅读更多 →
Pycopy:存储优先的Python方言,让嵌入式与云端部署更轻量

Pycopy:存储优先的Python方言,让嵌入式与云端部署更轻量

简介:Pycopy是一个极简、轻量且可高度扩展的Python方言实现,源自MicroPython,面向桌面端、云端与微控制器等各类受限环境。该源码压缩包适合嵌入式及物联网开发者,也适合想理解精简解释器设计的程序员。项目实现了完整的Python 3.…

2026/10/15 16:25:22 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →