fir
首发版本:2.00.19/3.00.6
语法
fir(X, b)
详情
对输入数据 X 应用 FIR(有限脉冲响应)滤波器,返回滤波后的结果。
FIR 滤波器通过卷积实现线性滤波,其输出仅由当前及过去输入的加权和决定,系统总是稳定且易于设计线性相位。
数学表达式为:y[n] = b[0]·x[n] + b[1]·x[n-1] + … + b[M]·x[n-M],其中 b 为滤波器系数,M 为滤波器阶数。
注:
-
输入数据中的前导空值不参与计算,对应位置的输出也为空值。除前导空值外,序列中后续出现的空值均按 0 参与计算。
-
该函数与 Python
scipy.signal.lfilter(b, [1.0], X)功能相同,但两者对缺失值的处理方式不同。scipy.signal.lfilter不会对 NaN 进行特殊处理,因此 NaN 会参与滤波运算并传播到后续结果中。
参数
X 数值类型的常规向量,表示待滤波的数据。
b 非空数值类型的常规向量,表示 FIR 滤波器的分子系数。
返回值
返回与输入 X 相同形式且长度一致的结果。
例子
例1. 对向量应用 FIR 滤波。
x = 1 2 3 4 5
b = 0.2 0.3 0.5
fir(x, b)
// output: [0.2,0.7,1.7,2.7,3.7]
x = [1, 2, NULL, 4] // 等价于 [1, 2, 0, 4]
b = 0.5 0.5
fir(x, b)
// output: [0.5,1.5,1,2]
例2. 高频交易中,逐笔成交价存在大量微观噪声。用 FIR 滤波器可以在不引入相位失真的前提下平滑价格序列,适合对延迟不敏感但对波形精度要求高的场景(如盘后因子计算)。
下例模拟了某只股票当日 1000 笔 Tick 数据,并用一个 5 阶等权 FIR 低通滤波器(本质上就是简单移动平均的滤波器形式)对价格序列进行平滑降噪。
// 1. 创建 catalog、库、表
if(existsCatalog("financeData")){
dropCatalog("financeData")
}
createCatalog("financeData")
go
use catalog financeData
// 使用 catalog 方式创建 schema
// 建议使用日期 + 股票代码复合分区
create database trades
partitioned by VALUE(2026.06.01..2026.06.30), HASH([SYMBOL, 16]),
engine='TSDB'
go
create table trades.tick (
SecurityID SYMBOL,
TradeDate DATE,
TradeTime TIMESTAMP,
TradePrice DOUBLE,
TradeVolume INT
)
partitioned by TradeDate, SecurityID,
sortColumns = [`SecurityID, `TradeTime],
keepDuplicates = ALL
// 2. 模拟 600519.SH 当日 1000 笔 Tick
n = 1000
idx = 0..(n - 1)
baseTime = 2026.06.02T09:30:00.000
ts = baseTime + idx * 3000 // 每 3 秒一笔
// 模拟价格:1800 附近随机游走 + 高频噪声
cumReturns = cumsum(rand(0.2, n) - 0.1)
noise = norm(0.0, 0.3, n)
prices = 1800.0 + cumReturns + noise
volumes = rand(100, n) + 1
t = table(
symbol(take("600519.SH", n)) as SecurityID,
take(2026.06.02, n) as TradeDate,
ts as TradeTime,
round(prices, 2) as TradePrice,
int(volumes) as TradeVolume
)
// 3. 插入数据
trades.tick.append!(t)
// 4. 查询原始 Tick 数据
raw = select TradeTime, TradePrice
from trades.tick
where SecurityID = `600519.SH
and TradeDate = 2026.06.02
order by TradeTime
// 5. FIR 滤波降噪
// 5 阶等权 FIR 低通滤波器
// 相当于 5 点滑动平均形式的有限脉冲响应滤波
b = take(1.0 / 5, 5)
result = select
TradeTime,
TradePrice as rawPrice,
fir(TradePrice, b) as filteredPrice
from raw
select top 10 * from result
相关函数:iir
