Welcome to Xu’Log

Hello, I’m LexHsu. Pain is inevitable, but suffering is optional. I’ll be documenting my learning journey on this blog with immense patience, starting in 2025.

RL在自动驾驶中的应用

过程梳理 Metric cache Metric Cache 在这个工程中是一个预计算的环境真值与场景快照,专门为了加速 PDM (Predictive Drive Model) 评分过程而设计的。 它的核心作用是:解耦了繁重的 NuPlan 数据加载与实时特征计算。在评估(Inference/Evaluation)阶段,模型不需要去查原始的 NuPlan 数据库,而是直接读取这个 Cache 来获取所有的环境约束和评判标准。 以下是详细的工程视角解析: 字段定义 一个 Python dataclass 对象,被序列化为 .pkl 文件(LZMA压缩)。 它包含以下核心字段: file_path: 原始文件路径。 trajectory: PDM-Closed Planner 生成的参考轨迹。这是一个基于规则(IDM)生成的“专家演示”轨迹,用于作为 Baseline 对比。 ego_state: 自车的初始状态(位置、速度、朝向)。 observation: 未来时刻的动态障碍物真值 (PDMObservation)。包含周围车辆、行人的未来轨迹(已插值到 10Hz)。 centerline: 车道中心线 (PDMPath)。用于判断自车是否在正确路线上以及计算行驶进度。 route_lane_ids: 导航路径上的车道 ID 列表。 drivable_area_map: 可行驶区域图 (PDMDrivableMap)。用于快速碰撞检测,判断自车是否驶出道路。 生产 生成逻辑在 metric_cache_processor.py 中。 当你运行 run_metric_caching.py 时,流程如下: 加载场景: 从 NuPlan 数据库读取原始 Scenario。 运行 PDM-Closed Planner: 也就是运行一个基于 IDM (Intelligent Driver Model) 的规则算法,生成一条“参考轨迹”并存入 trajectory 字段。 插值真值 (Ground Truth): 将场景中所有其他 Agent 的真实轨迹插值到 10Hz(0.1秒间隔),存入 observation。这是为了在评估时进行高精度的碰撞检测。 提取地图: 提取周围的可行驶区域多边形和中心线,存入 drivable_area_map 和 centerline。 序列化: 将上述所有对象打包,压缩保存为 Cache 文件。 使用 在推理/评估脚本 run_pdm_score.py (调用 pdm_score.py) 中: ...

January 20, 2026 · 7 min · lexxu

Nvidia_VLA

Alpamayo / Cosmos-Reason 学习笔记 主题:Vision-Language-Action(VLA)规划、Reason–Action 对齐、Anti Ego-Shortcut、COC Dataset、RL(GRPO) 1. 论文关注的核心问题(VLA 视角) 论文围绕 VLA 在自动驾驶中的落地问题,明确指出现有方法的痛点: 多帧时序理解 连续多帧中信息高度冗余,但决策依赖变化而非静态状态 决策必须具备因果性 不能只学到“结果—动作”的统计共现 需要显式建模 为什么 采取某个动作 实时、多模态、符合动力学 / 运动学约束 多模轨迹必须可执行、可快速解码 不能牺牲实时性 Reason 与 Action 强对齐 Reason 不是事后解释 必须能被 Action 验证与约束 2. 系统输入 / 输出设计 2.1 输入(Inputs) Multi-camera、多时间戳视觉观测 User command + Navigation instructions Historical ego motion(速度、轨迹历史等) 设计原则: Ego 信息作为 conditioning,而非决策的主要因果来源,避免 ego shortcut。 2.2 输出(Outputs) Reason Trace 对关键对象、因果关系、环境变化的解释 Meta Action 高层语义动作(stop / yield / follow / lane change 等) Future Trajectories(多模) ...

January 11, 2026 · 3 min

判断市场风向指标组合策略

核心指标组合 1. ATR(平均真实波幅) 定义:衡量市场波动性的指标,计算一定周期内的平均真实波幅。 计算方法:TR(True Range)是以下三者的最大值: 当日最高价 - 当日最低价 |当日最高价 - 昨日收盘价| |当日最低价 - 昨日收盘价| ATR对TR取指数移动平均(EMA)。 作用:衡量市场波动率,ATR值越大说明趋势越强,ATR值小且稳定说明处于震荡 用法:当ATR持续处于低位(如低于近期均值的30%),可判断为震荡市;当ATR快速放大,可能趋势启动 2. 布林带(Bollinger Bands) 作用:识别价格运行区间和突破信号 震荡市特征:价格在布林带上下轨之间来回震荡,布林带收窄 趋势市特征:价格沿布林带上轨或下轨运行,布林带开口扩张 用法: 震荡市:在布林带上轨卖出,下轨买入 趋势市:价格突破布林带后顺势跟进 布林带收窄+价格突破:趋势启动信号 布林带开口+价格沿上轨/下轨运行:趋势延续 布林带收窄+价格在通道内震荡:高抛低吸 3. ADX(平均方向指数) 定义:衡量趋势强度的指标,数值范围0-100; 不判断方向,指衡量强弱。 作用:量化趋势强度 用法: ADX < 20:市场处于震荡或无趋势状态,适合高抛低吸策略 ADX > 25:趋势确立,市场进入单边行情 ADX > 40:强势趋势,可能接近趋势尾声 ADX > 50:极端趋势,需警惕反转风险 4. RSI(相对强弱指标) 定义:通过比较一定周期内上涨幅度和下跌幅度的相对强度来反映市场超买超卖状态,反应多空的动能。 计算方法: $$ RSI = 100 - \frac{100}{1 + RS} $$ 其中,$RS$ 是平均上涨点数与平均下跌点数的比值。 作用:识别超买超卖区域 震荡市用法:在RSI 30-70区间内高抛低吸;突破70或跌破30可能预示趋势转换 实战组合策略 震荡市识别条件: ATR处于近期低位 ADX<20 布林带收窄,价格在上下轨间震荡 RSI在30-70区间运行 趋势市识别条件: ...

November 20, 2025 · 1 min · lexxu

ATR波动率突破策略:自适应止损的数学原理

ATR指标原理 真实波幅(True Range) 传统波动率计算(最高价-最低价)忽略了跳空缺口。ATR通过 真实波幅(TR) 解决这个问题: $$ TR_t = \max \begin{cases} H_t - L_t \ |H_t - C_{t-1}| \ |L_t - C_{t-1}| \end{cases} $$ 其中: $H_t$: 当前最高价 $L_t$: 当前最低价 $C_{t-1}$: 前一周期收盘价 物理意义: TR捕捉了三种波动来源: 日内波动 ($H_t - L_t$) 向上跳空 ($H_t - C_{t-1}$) 向下跳空 ($L_t - C_{t-1}$) 平均真实波幅(ATR) 对TR取指数移动平均(EMA): $$ ATR_t = \frac{(N-1) \times ATR_{t-1} + TR_t}{N} $$ 交互演示:ATR 参数的影响 为了更直观地理解 ATR,我制作了一个交互式工具。你可以拖动下面的滑块,改变周期 $N$,观察 ATR 曲线(下方蓝色区域)和基于 ATR 的通道(上方虚线)是如何变化的。 ATR 动态演示 Interactive Demo ATR 周期 (N): 14 💡拖动滑块观察:周期越大,ATR曲线越平滑,对价格波动的反应越迟钝(滞后性)。 ...

November 16, 2025 · 3 min · LexHsu

基于vnpy的量化交易系统架构与策略分类

系统架构 系统架构 基于 vnpy 4.1.0 构建的生产级量化交易平台,采用分层架构设计: 数据层 Wind API: 历史行情获取与实时数据推送 SQLite: 本地数据存储与索引优化 数据验证: 缺失值检测、异常值过滤、时间序列对齐 交易层 CTP网关: 东方证券期货接口,支持实盘交易 订单管理: 订单验证、重复检测、撤单管理 风控系统: 保证金实时监控 最大持仓限制 单笔订单金额限制 策略层 CTA引擎: 基于vnpy_ctastrategy的策略框架 回测引擎: 支持参数优化和多策略组合 性能分析: 夏普比率、最大回撤、盈亏比、胜率等 监控层 Rich终端: 实时持仓、PnL、订单状态 日志系统: 分级日志记录和错误追踪 可视化: Plotly交互式图表 + Matplotlib静态图表 策略分类体系 量化策略按交易逻辑可分为四大类: 1. 趋势跟踪策略 核心思想: 识别趋势方向,顺势交易。 策略 信号来源 适用市场 ATR波动率突破 价格突破 + ATR过滤 趋势初期、波动率扩大 动量反转组合 短期动量 + 长期反转 趋势延续但有回调 均线交叉 快慢均线金叉/死叉 明确趋势行情 通道突破 唐奇安通道/布林带上下轨 区间震荡后的突破 国债期货特点: 趋势持续性强(政策驱动) 单日波动小,需持仓数日至数周 适合中长期趋势策略 2. 均值回归策略 核心思想: 价格偏离均值后会回归。 ...

November 15, 2025 · 3 min · LexHsu

Hugo + PaperMod 博客写作完全指南

📝 创建新文章 使用 Hugo 命令创建 1 2 3 4 # 创建新文章 hugo new posts/my-article.md # 文章会自动应用 archetypes/default.md 模板 文件命名建议 ✅ 推荐:使用小写字母 + 连字符:how-to-write-hugo.md ✅ 可选:使用下划线:my_first_post.md ⚠️ 支持但不推荐:中文文件名 我的文章.md 🎯 Front Matter 配置详解 Front Matter 是文章开头的元数据部分,Hugo 支持 YAML 和 TOML 两种格式。 YAML 格式(推荐) 使用 --- 包裹,更易读,是本博客的标准格式: 1 2 3 4 5 6 7 8 9 --- title: "文章标题" date: 2025-11-15T14:30:00+08:00 draft: false author: "LexHsu" categories: ["tech", "life"] tags: ["hugo", "markdown"] description: "文章摘要,显示在列表页和搜索结果中" --- TOML 格式(备选) 使用 +++ 包裹: ...

November 15, 2025 · 6 min · LexHsu

策略解析:BasicSpreadStrategy (基础价差交易)

源码文件:vnpy_spreadtrading.strategies.basic_spread_strategy 1. 策略概述 BasicSpreadStrategy 与其说是一个自动策略,不如说是一个智能执行工具。 它不包含任何指标计算或预测逻辑,而是完全按照用户在参数中指定的固定价格进行挂单交易。它适合那些通过主观判断或外部计算得出目标价差,然后希望程序自动完成“腿A+腿B”复杂下单过程的交易员。 基类:SpreadStrategyTemplate 核心逻辑:固定点位开平 + 时间过滤 适用场景:主观套利、跨期移仓 2. 核心参数 参数名 含义 buy_price 买入开仓触发价 sell_price 卖出平仓触发价 short_price 卖出开仓触发价 cover_price 买入平仓触发价 max_pos 目标持仓量 start_time 每日开始交易时间 (如 “9:00:00”) end_time 每日停止交易时间 (如 “15:00:00”) 3. 策略逻辑详解 3.1 时间过滤器 策略首先检查当前时间是否在允许的交易时段内。如果不在,会强制停止所有正在运行的算法。 1 2 3 4 5 self.update_time = self.spread.datetime.time() if self.update_time < self.start_t or self.update_time >= self.end_t: self.stop_open_algos() self.stop_close_algos() return 3.2 状态机逻辑 策略根据当前的持仓状态 (spread_pos) 决定启动哪种算法。 空仓 (spread_pos == 0): 检查是否已启动买入算法 (buy_algoid),若无则启动。 检查是否已启动卖出算法 (short_algoid),若无则启动。 注意:这里是同时监控双向开仓机会。 持有多头 (spread_pos > 0): 停止开仓算法。 启动卖出平仓算法 (sell_algoid),目标价为 sell_price。 持有空头 (spread_pos < 0): ...

May 13, 2025 · 1 min

策略解析:StatisticalArbitrageStrategy (统计套利)

源码文件:vnpy_spreadtrading.strategies.statistical_arbitrage_strategy 1. 策略概述 StatisticalArbitrageStrategy 是一个经典的 均值回归 (Mean Reversion) 策略,应用于价差交易。 其核心假设是:两个相关性极高的品种(如豆油/棕榈油,螺纹/热卷),它们的价差会围绕一个均值波动。当价差偏离均值过大(突破布林带上轨/下轨)时,大概率会回归。 基类:SpreadStrategyTemplate 核心指标:Bollinger Bands (布林带) 交易逻辑:逆势交易(高抛低吸) 2. 核心参数 参数名 默认值 含义 boll_window 20 布林带均线周期 boll_dev 2 布林带标准差倍数 max_pos 10 最大持仓量 payup 10 算法执行时的超价跳数 interval 5 算法撤单重发间隔(秒) 3. 策略逻辑详解 3.1 K 线合成与指标计算 策略使用 BarGenerator 合成价差的 K 线(注意:是价差本身的 K 线,不是单腿的)。 在 on_spread_bar 中计算布林带: 1 2 self.boll_mid = self.am.sma(self.boll_window) self.boll_up, self.boll_down = self.am.boll(self.boll_window, self.boll_dev) 3.2 交易信号 策略逻辑非常清晰,分为三种状态: 空仓时 (spread_pos == 0): 做空价差:价差 > 上轨 (boll_up)。预期价差回归下跌。 做多价差:价差 < 下轨 (boll_down)。预期价差回归上涨。 1 2 3 4 if bar.close_price >= self.boll_up: self.start_short_algo(bar.close_price - 10, self.max_pos, ...) elif bar.close_price <= self.boll_down: self.start_long_algo(bar.close_price + 10, self.max_pos, ...) 持有空头 (spread_pos < 0): ...

May 12, 2025 · 1 min

VN.PY SpreadTrading 策略模板与通用接口详解

在进行价差交易(套利)开发前,必须理解 vnpy_spreadtrading.template 提供的基础框架。与 CTA 策略不同,价差交易涉及多条腿(Legs)的同步操作,因此引入了“算法执行”的概念。 1. SpreadStrategyTemplate:策略的大脑 所有价差策略都继承自 SpreadStrategyTemplate。 1.1 核心回调函数 回调函数 触发时机 典型用途 on_init 策略初始化 初始化变量,加载历史数据 on_start 策略启动 标记状态 on_spread_data 价差行情更新 核心逻辑区:判断价差是否满足开平仓条件 on_spread_pos 价差持仓更新 监听持仓变化,决定下一步动作 on_spread_algo 算法状态更新 监听算法执行进度(如算法完成、停止) 1.2 算法启动接口 价差交易不直接发单(不调用 buy/sell),而是启动一个算法 (Algo) 来负责执行。 这是因为买入一个价差通常意味着“买入腿A + 卖出腿B”,必须保证原子性或滑点控制。 买入价差 (Long Spread): 1 self.start_long_algo(price, volume, payup, interval, lock) price: 价差限价 volume: 数量 payup: 超价跳数(用于保证成交) interval: 撤单重发间隔 lock: 是否锁仓(针对上期所) 卖出价差 (Short Spread): 1 self.start_short_algo(price, volume, payup, interval, lock) 1.3 停止算法 stop_algo(algoid): 停止特定算法 stop_all_algos(): 停止所有正在运行的算法 2. SpreadAlgoTemplate:执行的手脚 策略只负责“决定要做什么”,而 SpreadAlgoTemplate 负责“具体怎么做”。 ...

May 11, 2025 · 1 min

策略解析:TestStrategy (功能测试工具)

源码文件:vnpy_ctastrategy.strategies.test_strategy 1. 策略概述 TestStrategy 并不是一个用于实盘获利的交易策略,而是一个调试工具。 它的主要作用是帮助开发者验证: 交易接口(Gateway)是否连接正常。 策略引擎(CtaEngine)是否能正确收发订单。 测试下单函数的执行耗时。 基类:CtaTemplate 触发机制:基于 Tick 计数,每隔 N 个 Tick 执行一个测试动作。 2. 测试流程 策略内部维护了一个函数列表 self.test_funcs,按顺序存放了要测试的动作: 市价单测试 (test_market_order): 以涨停价 (limit_up) 发出买单,模拟市价成交(在期货中通常用对手价或超价模拟市价)。 限价单测试 (test_limit_order): 以跌停价 (limit_down) 发出买单,模拟挂单(通常不会立即成交)。 全撤测试 (test_cancel_all): 调用 cancel_all() 撤销之前挂出的所有未成交订单。 停止单测试 (test_stop_order): 发出本地停止单(Stop Order),验证策略引擎的触发机制。 3. 核心代码逻辑 在 on_tick 中,每收到 test_trigger (默认10) 个 Tick,就弹出一个测试函数执行,并计算耗时。 1 2 3 4 5 6 7 8 9 10 11 self.tick_count += 1 if self.tick_count >= self.test_trigger: self.tick_count = 0 if self.test_funcs: test_func = self.test_funcs.pop(0) # 取出下一个测试任务 start = time() test_func() # 执行 time_cost = (time() - start) * 1000 # 计算耗时(ms) self.write_log(f"耗时{time_cost}毫秒") 4. 使用场景 当你刚配置好一个新的交易接口(比如连接到一个新的仿真环境),或者修改了底层引擎代码后,可以先运行这个策略: ...

May 10, 2025 · 1 min