资讯动态

FPGA硬件加速在金融高频交易中的十进制浮点运算实践

发布时间:2026/8/26 1:28:31 来源:尧图企业网站定制
1. 项目概述当金融交易遇上硬件加速在金融交易的世界里尤其是高频交易这个领域时间不是金钱时间是金钱的平方甚至是立方。每一微秒的延迟都可能意味着数百万美元的利润流失或风险敞口。这就是为什么整个行业都在疯狂地追逐“零延迟”这个理论极限。传统的优化手段比如把服务器搬到交易所隔壁、使用硬件行情分发系统、部署无损网络交换机在过去十年里已经成为了标配。但当你把这些物理和网络层的延迟压缩到极致后下一个瓶颈在哪里答案就在交易策略核心的计算环节本身。我曾在技术业务开发领域深耕多年亲眼见证了从纯软件交易系统到软硬结合再到如今以FPGA为核心的硬件加速方案的演进。这篇文章我想深入聊聊一个在追求极致延迟过程中无法回避却又常常被硬件工程师们“选择性忽视”的问题数值计算的精度。具体来说是十进制浮点运算在高频交易实时计算中的关键角色。很多人以为把算法用C写快再往FPGA里一扔用硬件并行性暴力加速就万事大吉了。但如果你处理的交易数据、价格、指标本身要求严格的十进制精度比如银行间报价、某些金融衍生品定价那么直接用硬件擅长的二进制浮点运算可能会在不知不觉中引入难以察觉的计算偏差在极端市场波动下这种偏差的累积效应可能是灾难性的。本文将拆解一个为超低延迟高频交易环境设计的实时、带外数值计算模型。这个模型的核心思想是把高精度、高吞吐的数值计算从主交易决策路径中剥离出来用专用的FPGA硬件单元并行处理确保在每一个市场数据“滴答”声之间所有需要的指标和指数都已准备就绪。这不仅关乎速度更关乎在极致速度下的确定性和准确性。我们将从为什么需要十进制精度开始探讨几种实现方式的优劣最后深入一个可落地的FPGA架构模型并分享一些在真实部署中积累的实操要点和避坑指南。2. 核心需求解析为什么是十进制浮点要理解为什么在高频交易这种对延迟锱铢必较的场景下我们还要“自找麻烦”地追求十进制浮点运算需要先厘清两个基本概念业务需求和技术现实。2.1 业务驱动的精度合规要求首先并非所有金融计算都对十进制精度有强制要求。很多统计套利、趋势跟踪类的算法对微小的数值误差有较高的容忍度因为它们依赖的是统计规律和相对关系。这时使用硬件原生支持、效率极高的二进制浮点单元似乎是理所当然的选择。然而金融世界是高度监管和标准化的。许多场景必须遵循严格的十进制精度规则法规遵从某些金融监管机构明确要求交易和报告系统必须使用十进制算术以确保与人工计算或特定行业标准如某些债券的应计利息计算完全一致避免因二进制舍入误差导致的法律或审计风险。确定性金融应用例如外汇交易中精确到小数点后多位如美元/日元报价到0.01日元的定价、利率衍生品的精确现值计算、以及与法定货币挂钩的加密货币交易。这些计算必须是确定性的在任何平台上、任何时间点给定相同输入都必须产生完全相同的结果。与遗留系统交互大量后台清算、风险管理系统以及行业标准协议如FIX协议中数字常以十进制字符串形式传递。如果前台交易系统使用二进制浮点计算在与这些系统进行对账时可能因为极细微的舍入差异而产生对账失败引发不必要的运维警报甚至人工干预。“滑点”的深层含义文中提到的“滑点”通常指订单预期价格与实际成交价之间的差异。在HFT中滑点不仅由网络延迟引起更由“决策延迟”构成。如果你的策略算法因为等待一个高精度计算的结果而比竞争对手慢了哪怕几百纳秒那么市场价格的变动就可能让你错过最佳成交价位这就是计算延迟导致的滑点。因此降低滑点是一个系统工程需要在网络、系统和计算三个层面同时推进。2.2 二进制浮点的固有缺陷从技术根源看问题出在数字的表示上。我们人类习惯的十进制系统以10为基数与计算机底层使用的二进制系统以2为基数存在根本的不兼容。一个经典例子在Python或C中用双精度二进制浮点数表示0.1然后连续加10次结果并不是精确的1.0而是一个极其接近但略有误差的数如1.0000000000000007。这是因为0.1这个简单的十进制小数在二进制下是一个无限循环小数类似1/3在十进制下的0.333...无法被有限位的二进制浮点数精确表示。这种表示误差在单次计算中可能微不足道但在高频交易中策略算法会对同一组数据执行成千上万次迭代计算例如计算移动平均、波动率、相关系数。误差会在迭代中累积、放大最终可能导致策略信号出现偏差。对于基于价格微小变动例如一个最小报价单位进行决策的套利策略这种偏差足以让一个盈利策略变成亏损策略。注意不要混淆“高精度”和“十进制精度”。你可以使用更高位数的二进制浮点如双精度代替单精度来减少误差但无法从根本上消除对十进制数如0.1的表示误差。只有十进制浮点格式能从表示层面解决这个问题。3. 实现十进制精度的技术路径对比既然十进制精度在某些场景下是必须的那么有哪些技术手段可以实现它呢在实际项目中我们通常会评估以下几种方案各有其严重的权衡。3.1 方案一采用支持DFP的专用服务器硬件代表平台IBM Power系列、Oracle SPARC系列处理器。这些CPU在硬件指令集层面提供了对十进制浮点格式如IEEE 754-2008中定义的Decimal64/Decimal128的基本运算加、减、乘、比较支持。优点编程透明性高开发者可以使用高级语言如C、Java和标准库编译器会将十进制运算映射到硬件指令无需彻底重写算法。生态系统成熟尤其在企业级金融后台系统中有较长的应用历史。缺点与HFT场景的冲突延迟过高通用CPU的指令执行流水线、缓存层次结构决定了其单次操作的延迟在纳秒到微秒级且受操作系统调度、其他进程干扰影响无法提供HFT所需的确定性的亚微秒级延迟。吞吐量有限尽管有SIMD指令但相比FPGA上可实现的成百上千个并行计算单元CPU的并行度是数量级上的差距。成本与功耗这类专用服务器硬件通常非常昂贵且能效比远低于定制化FPGA方案。结论此方案适用于对延迟不敏感的后台批处理、风险计算但完全不适合ULL-HFT的前台交易系统。3.2 方案二软件模拟与库函数常见做法使用像Intel Decimal Floating-Point Math Library这样的软件库或者在代码中手动实现基于BigInteger大整数的十进制运算。原理将十进制小数通过缩放因子转换为整数例如将123.456美元表示为123456美分所有计算在整数域进行最后再缩放回小数。更复杂的库则会实现完整的十进制浮点运算算法。优点灵活性最高可在任何标准x86服务器上运行部署简单与现有软件栈集成容易。精度完全可控可以自定义精度和舍入模式。缺点在HFT中是致命的性能惩罚巨大软件模拟的十进制运算比硬件二进制浮点慢数十倍甚至数百倍。一次十进制除法或开方操作可能需要数百个CPU时钟周期。延迟不确定抖动大软件执行受系统负载、缓存命中率、垃圾回收如用Java实现等因素影响延迟抖动大这在追求确定性延迟的HFT中是绝不允许的。代码管理噩梦如果手动实现缩放整数法当不同数据源如股票价格、期权希腊值的精度小数位数不同时缩放因子管理会变得极其复杂代码可读性和可维护性急剧下降。3.3 方案三FPGA硬件加速——本文的核心这正是原文中SilMinds公司IP库以及我们所讨论模型选择的道路。其核心思想是将计算密集且对精度有严格要求的十进制浮点运算用硬件逻辑电路在FPGA上实现。优点极致低延迟与确定性FPGA中的逻辑电路是并行执行的硬件一个运算单元的延迟是固定且可预测的通常在几个到几十个时钟周期内完成结合数百MHz的时钟可实现纳秒级延迟且几乎没有抖动。超高吞吐量通过设计多个并行运算单元Processing Elements, PEs可以同时处理数百个金融产品的指标计算吞吐量远超任何通用处理器。能效比极高硬件电路只为特定计算任务服务没有通用CPU的取指、译码、调度等开销单位功耗下的计算能力显著提升。可定制集成可以将DFP运算单元与网络协议解析如FIX解码、二进制浮点运算单元、定点数运算单元集成在同一块FPGA芯片上实现从网络包到交易信号的端到端硬件加速。挑战开发门槛高需要硬件描述语言如Verilog/VHDL或高层次综合HLS知识。设计验证复杂金融计算对正确性要求极高硬件设计的验证需要投入大量资源。初始成本包括FPGA芯片、开发板、IP许可和开发人力成本。实操心得对于HFT团队是否自研DFP IP是一个关键决策。除非有极强的硬件团队和充足的预算否则从可靠的第三方如SilMinds或Xilinx/Vivado HLS库中的某些支持购买或获取经过硅验证的IP核是更高效、风险更低的选择。自己实现一个完全符合IEEE 754-2008标准的Decimal64/128运算单元其验证工作量可能远超算法逻辑本身。4. 实时带外数值计算模型架构详解“带外”计算是降低核心交易路径延迟的关键设计模式。下面我们来拆解这个模型的各个组成部分及其协作关系。4.1 模型整体数据流想象一下交易系统的数据处理流水线市场数据输入交易所的原始行情数据流通常基于UDP Multicast以极高速率涌入。协议解码与预处理FPGA上的网络协议卸载引擎首先解析这些数据包提取出关键的“更新”消息。对于广泛使用的FIX/FAST协议这一步包括解码、过滤和转换。关键转换字符串到数值FIX协议中价格、数量等数字字段通常以ASCII字符串形式传输如“147.85”。这是第一个计算瓶颈。传统的软件系统需要调用atof()或类似的字符串转换函数这个操作相对耗时且不稳定。核心计算转换后的数值被送入计算引擎执行策略所需的各种指标计算如移动平均线、布林带、相对强弱指数等。决策与下单计算出的指标值被策略逻辑可能在软件或FPGA的另一部分使用生成交易信号并通过订单管理模块发送回交易所。在“带外”模型中第3步和第4步被从主流水线中剥离出来放入一个并行的、专用的硬件计算单元中。4.2 模型组件深度解析4.2.1 FIX/FAST解码与字符串转换单元这是整个模型的起点也是最容易被低估的环节。许多团队专注于优化计算内核却忽略了数据准备的延迟。功能该单元实时解析网络数据流识别出包含数字字段的标签如FIX Tag 44Price并将对应的ASCII字符串如“147.85”直接转换为硬件计算所需的内部数值格式。内部格式选择这里有一个关键设计决策。SilMinds IP内部使用DPD编码这是一种类似BCD但更紧凑的二进制编码特别适合硬件进行算术运算。然而为了灵活性其IP的输入/输出接口也支持BID编码另一种二进制整数十进制格式更适合与软件交互和原始的ASCII字符串。实现技巧并行解码一个FPGA可以同时部署多个解码流水线处理来自不同通道或不同证券的数据。流水线化设计将字符串解析、字符到数字的转换、小数点定位、最终格式组装等步骤设计成多级流水线每个时钟周期都能吞入新的字符串并吐出一个转换结果实现极高的吞吐率。与网络MAC层紧耦合理想情况下该单元应直接接入FPGA的以太网MAC硬核之后在数据包进入DDR内存之前就完成解析和转换实现“线上解析”避免任何内存访问延迟。4.2.2 十进制浮点算术单元库这是模型的心脏。一个完整的DFPA库应包含以下运算单元基本运算加法器、减法器、乘法器。这些相对简单但设计时需仔细处理符号位、指数对齐、尾数运算以及十进制规格化和舍入。复杂运算除法器、平方根器。这些是硬件实现中面积和延迟较大的单元通常采用迭代算法如SRT除法、牛顿-拉夫森迭代实现。特殊函数在某些策略中可能需要的函数如指数、对数、三角函数。这些通常通过查找表结合多项式近似来实现。设计考量精度与延迟的权衡可以设计不同精度的版本如Decimal64对应16位十进制数Decimal128对应34位。精度越高所需的逻辑资源和计算延迟也越大。需要根据实际业务需求如外汇需要高精度股票可能低一些来选择。流水线与并行化将复杂的运算分解为多个流水线阶段可以提高吞吐量。例如一个10级流水线的除法器虽然单个除法需要10个周期完成但每个周期都可以开始一个新的除法运算整体吞吐量是单周期启动间隔的倒数。与二进制浮点单元的协同FPGA内部通常有丰富的DSP Slice这些是高度优化的二进制乘法累加单元。一个聪明的设计是在策略允许的情况下将计算分解对精度不敏感的部分用高速的二进制浮点DSP块计算对精度敏感的核心部分再用DFP单元。这需要算法和硬件工程师紧密协作。4.2.3 带外计算引擎与内存交互这是“带外”概念的具体体现计算与决策解耦当FIX解码器转换出一个新的价格数据时它被同时做两件事被送入主交易决策流水线可能只是一个简单的比较逻辑用于紧急风控或极简策略。被广播到带外计算引擎。引擎工作方式计算引擎内部有多个并行的处理单元每个负责计算一个或一组金融指标。它利用当前tick的数据以及预先从共享内存中读取的上一个tick的计算结果和历史数据执行迭代计算。共享内存架构设计一个多端口、低延迟的片上内存如Block RAM或UltraRAM作为“黑板”。计算引擎在每个tick周期结束时将所有计算完成的新指标值写入这块内存的预定位置。所有策略逻辑单元无论是FPGA上的其他硬件模块还是通过PCIe总线访问的CPU软件都可以在下一个tick开始时同时、并行地从这块内存中读取它们需要的所有指标值。带来的好处消除计算等待策略逻辑无需等待指标计算完成。它总是在每个tick开始时就能立刻获得所有已更新的指标决策延迟降到最低。资源复用一套计算引擎产生的指标可以被无数个策略同时使用提高了硬件资源利用率。灵活性软件策略可以像查表一样快速获取硬件加速计算的结果实现了软硬件之间的高效分工。4.3 一个简化的FPGA逻辑框图以下是一个高度简化的顶层模块示意图展示了关键组件及其连接----------------------------------------------------------------------- | FPGA Logic Fabric | | | | ---------------- ----------------------------------------- | | | | | Out-of-Band Compute Engine | | | | Network Stack | | -------- -------- -------- | | | | Offload |-----| DFP Add | | DFP Mul| | DFP Div| ...| | | | FIX/FAST | | | Pipeline| |Pipeline| |Pipeline| | | | | Decoder | | -------- -------- -------- | | | | | | | | | ---------------- | Control Dispatch Logic | | | | ---------------------------------------- | | | Raw Market Data | | | | (Prices, Sizes) | Computed Indicators | | v v | | ---------------- --------------------- | | | Low-Latency | | Multi-Port Shared | | | | Decision Logic |-------------| Indicator RAM |-------- | | | (e.g., Simple | | (Blackboard) | | | | | Arb Strategy) | --------------------- | | | ---------------- ^ | | | | | | | -------------------------------------------------------------- | | | | | | PCIe Interface | | | (To Host CPU) | | ------------------------------------------------------------------ | | | -------------------------------------------------------------------- v Host Server CPU (Complex Strategy Logic)数据流说明网络数据包进入FPGA由网络协议卸载和FIX解码模块解析提取出数字字符串并转换为内部格式如DPD。转换后的原始数据一方面直接送给FPGA上的低延迟决策逻辑用于执行延迟要求最高的核心策略可能非常简单另一方面广播给带外计算引擎。带外计算引擎中的多个DFP运算管道并行工作计算各种复杂的指标如50周期移动平均、波动率等。计算完成的指标在下一个tick开始前被写入多端口共享内存。在下一个tick低延迟决策逻辑和通过PCIe接口访问的主机CPU复杂策略都可以同时从共享内存中读取它们需要的所有指标用于本tick的决策。CPU策略可以非常复杂但它获取输入数据的延迟是固定且极低的。5. 性能基准与量化收益谈论硬件加速必须用数据说话。原文提到了“相比优化软件高达1000倍的加速比”这个数字是如何来的又在实际中意味着什么5.1 基准测试方法论一个严谨的基准测试需要对比在完成相同计算任务、达到相同十进制精度的前提下硬件方案与软件方案的耗时。测试通常包括微基准测试测量单个操作如一次Decimal64乘法、除法的延迟和吞吐量。内核基准测试测量一个完整金融指标如计算一个包含100个证券的指数的计算时间。系统级基准测试在模拟或回放的真实市场数据流下测量从数据包进入网卡到所有指标可用的端到端延迟。软件对比基线应选择当前业界性能最优的软件实现例如使用Intel DFPML库并启用所有CPU优化AVX指令集。使用高度优化的C代码并采用缩放整数法。运行在最高性能的服务器CPU上如Intel Xeon Scalable或AMD EPYC的最新款并锁定CPU频率、绑定核心以避免调度干扰。5.2 硬件加速的收益分解假设我们有一个典型的计算任务为500支股票每支计算一个20周期的指数移动平均线。每个EMA计算需要一次乘法和一次加法。软件方案乐观估计一次优化的软件DFP加法约需50纳秒乘法约需70纳秒这已经是顶级CPU单核单次操作的水平。单支股票单次EMA更新120纳秒。500支股票顺序执行500 * 120 ns 60,000 ns 60微秒。这还没算上循环开销、数据搬运、以及多核并行带来的同步开销。实际在软件中由于缓存、内存访问等因素延迟可能达到100微秒以上且存在较大抖动。FPGA硬件方案一个高度流水线化的DFP加法器/乘法器延迟假设为10个时钟周期。FPGA运行在300MHz时钟周期约3.33纳秒。单次操作延迟10 * 3.33 ns ≈ 33.3纳秒。关键在这里FPGA可以实例化500个并行的EMA计算单元。那么500支股票的EMA更新是同时开始、同时完成的。总耗时 ≈ 单个单元的延迟 ≈33.3纳秒。加速比60微秒 / 33.3纳秒 ≈ 1800倍。这解释了“1000倍”量级加速的由来。核心秘密不在于单个操作快多少这里只快了约4倍而在于极致的并行性。软件受限于CPU核心数即使有100核调度500个任务也有开销而FPGA可以为你特定的任务定制出任意数量的计算单元。5.3 对未来市场数据频率的预留目前主流交易所的行情更新频率在微秒到毫秒级。但技术总是在发展一些新兴的交易平台或数据供应商已经开始提供纳秒级时间戳的数据。硬件DFP加速方案的价值在于其“未来证明”性更快的行情当行情Tick率从毫秒提升到微秒甚至更高时软件方案可能完全无法跟上而硬件方案由于延迟固定且极低依然游刃有余。更复杂的策略节省出来的大量时间预算可以让策略开发者使用更复杂、计算量更大的模型如高阶统计模型、简单的ML推理而无需担心计算延迟成为瓶颈。更多的证券可以同时监控和计算更多金融产品的指标扩大策略的覆盖范围。6. 实际部署考量与避坑指南将这样一个模型从理论设计落地到生产环境会面临一系列工程挑战。以下是一些从实际项目中总结的关键点。6.1 资源估算与选型FPGA资源查找表LUT、寄存器FF、块内存BRAM、DSP Slice是有限的。在设计之初必须进行精确的资源估算。DFP运算单元面积一个完整的Decimal64加法器/乘法器可能消耗数千个LUTs而除法器/开方器可能消耗数万个。需要根据策略所需的运算类型和并行度计算总资源需求。内存需求共享指标内存的大小取决于指标数量、证券数量和精度。例如为2000支股票存储10个Decimal128指标需要2000 * 10 * 128位 ≈ 3.2 Mb。这需要合理规划BRAM或UltraRAM的使用。芯片选型根据资源总需求和性能目标逻辑规模、内存带宽、高速接口数量选择FPGA型号。例如Xilinx的UltraScale系列或Intel的Stratix 10系列常用于高性能计算场景。板卡选型是使用多FPGA的PCIe加速卡如Xilinx Alveo还是将FPGA集成到网络卡上如SmartNIC前者计算能力强适合复杂策略后者网络延迟更低适合对网络到计算路径延迟有极致要求的场景。注意资源估算要留有余量通常预留20-30%的余量用于布局布线优化、后期功能添加和时序收敛。6.2 时序收敛与时钟域设计这是FPGA设计中最具挑战性的环节之一。高时钟频率为了达到纳秒级延迟需要尽可能提高设计的工作频率。但这会导致时序路径紧张。流水线深度在关键路径如复杂的DFP除法器中插入寄存器进行流水线化是提高频率的常用方法。但这会增加从输入到输出的总延迟周期数。需要在吞吐量通过流水线提高和单次操作延迟因流水线而增加之间做出权衡。对于HFT通常更关注吞吐量和确定性单次操作延迟只要在Tick周期内完成即可。多时钟域网络接口、PCIe接口、核心计算逻辑可能运行在不同的时钟频率下。需要设计可靠的时钟域交叉电路确保数据在不同时钟域间安全、无丢失地传递。避坑技巧在设计的早期就使用工具的时序分析功能。将计算引擎的关键路径单独约束并尝试不同的流水线划分方案。使用FPGA厂商提供的高速存储器如UltraRAM和DSP块的专用路径它们通常有更好的时序特性。6.3 验证与测试策略金融硬件的错误成本是天文数字。验证必须极其严格。单元测试对每一个DFP运算IP核必须进行穷尽或覆盖率高额的测试验证其在不同输入组合包括正数、负数、零、无穷大、NaN下的输出确保完全符合IEEE 754-2008 Decimal标准。参考模型对比在PC上使用高精度数学库如Python的decimal模块或Java的BigDecimal生成测试向量与FPGA仿真结果进行逐位比较。系统级仿真使用SystemVerilog或Cocotb等框架搭建测试平台模拟真实的网络数据流灌入历史或合成的市场数据验证整个带外计算引擎的输出是否正确。硬件在环测试将FPGA比特流加载到实际板卡上与软件交易系统对接在隔离的网络环境中进行测试。使用硬件逻辑分析仪如ChipScope/SignalTap抓取内部信号进行深度调试。回归测试套件任何修改都必须通过完整的回归测试才能被集成。6.4 软硬件协同与系统集成FPGA加速卡不是孤岛它需要与主机软件紧密协同。驱动程序与API需要开发或使用厂商提供的稳定驱动程序并提供简洁明了的API供策略软件调用例如read_indicator(symbol_id, indicator_id)。内存映射共享内存的布局必须在硬件设计和软件头文件中精确定义确保双方对每个内存地址存放的数据含义有完全一致的认知。同步机制如何通知软件“新的指标数据已就绪”可以采用轮询软件定期检查内存中的时间戳或中断方式。轮询延迟更确定但占用CPU中断有延迟但省CPU。需要根据具体场景选择。监控与诊断硬件中需要植入性能计数器和状态寄存器用于监控数据吞吐量、计算单元利用率、错误计数等便于运维和性能调优。7. 总结与个人体会构建一个用于ULL-HFT的实时FPGA数值计算系统是一项融合了金融知识、算法理解、硬件工程和系统架构的复杂挑战。它绝不是简单地将C代码扔给HLS工具就能完成的。从我的经验来看成功的关键在于以下几点首先明确需求是根本。不要为了用硬件而用硬件。必须精确分析你的策略中哪些计算部分是延迟敏感且符合硬件加速特征的计算密集、规则、并行度高哪些部分又需要十进制的绝对精度。有时一个混合架构——将最核心的、要求确定性的计算放在FPGA将复杂的、需要频繁更新的策略逻辑留在CPU——可能是性价比和开发效率最高的选择。其次拥抱“带外”设计哲学。这是降低系统延迟的关键架构模式。其精髓在于将数据的生产计算与消费决策解耦通过一个高速的共享存储来连接它们。这种思想不仅可以用于指标计算还可以扩展到风险检查、订单路由预处理等多个方面。再者重视验证和数据一致性。在硬件领域验证的工作量往往超过设计本身。特别是金融应用必须建立黄金参考模型和庞大的测试向量库。在软硬件接口处数据格式、字节序、同步方式都必须有清晰无误的定义。最后性能优化是一个持续的过程。第一版设计可能只实现了功能。接下来需要利用FPGA的时序报告、资源利用率报告结合实际的行情数据负载不断进行迭代优化调整流水线深度、平衡逻辑和存储资源、优化数据流路径。这个过程需要硬件工程师和量化研究员坐在一起共同分析性能瓶颈。这条路走下来并不轻松需要投入大量的时间和专业资源。但当你看到自己的系统在每一个市场数据脉冲到来时都能以纳秒级的确定性完成所有关键计算为策略决策抢得那至关重要的先机时你会觉得这一切都是值得的。在这个以微秒乃至纳秒论英雄的领域拥有这样一套定制化的计算引擎无疑是构建核心竞争力的重要一环。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价