Operators

关于量化交易的基础运算符

2025-01-22 00:36:42   2025-02-11 06:23:55   量化交易   17 views  

  量化交易  

算术运算符(Arithmetic Operators)

abs(x)

绝对值 of x

解析:
返回 x 的绝对值,即忽略 x 的符号,仅返回其数值大小。例如,abs(-5) 将返回 5


add(x, y, filter = false), x + y

所有输入相加(至少需要 2 个输入)。如果 filter = true,在相加前将所有输入的 NaN 过滤为 0。

解析:
将多个输入值相加。如果 filter 参数设置为 true,则在相加之前,将所有 NaN 值替换为 0,以避免计算过程中出现 NaN 结果。


densify(x)

将许多桶的分组字段转换为较少数量的可用桶,以提高分组字段的计算效率。

解析:
优化分组字段,通过减少分组的数量来提高计算效率。这在处理大量分组数据时尤为有用,可以降低计算资源的消耗。


divide(x, y), x / y

x 除以 y

解析:
执行除法运算,将 x 除以 y。例如,divide(10, 2) 将返回 5


inverse(x)

1 / x

解析:
返回 x 的倒数。如果 x = 2,则 inverse(x) 返回 0.5


log(x)

自然对数。例如:log(high/low) 使用 high/low 比率的自然对数作为股票权重。

解析:
计算 x 的自然对数(以 e 为底)。在金融中,常用于处理比例数据,以便更好地分析其变化趋势。


max(x, y, ..)

所有输入中的最大值。至少需要 2 个输入。

解析:
返回一组数中的最大值。例如,max(3, 7, 2) 将返回 7


min(x, y ..)

所有输入中的最小值。至少需要 2 个输入。

解析:
返回一组数中的最小值。例如,min(3, 7, 2) 将返回 2


multiply(x, y, ... , filter=false), x * y

所有输入相乘。至少需要 2 个输入。filter 设置为 true 时,将 NaN 值设置为 1

解析:
将多个输入值相乘。如果 filter 参数设置为 true,则在相乘之前,将所有 NaN 值替换为 1,以确保计算结果不受 NaN 值的影响。


power(x, y)

xy 次方

解析:
x 提升到 y 次方。例如,power(2, 3) 将返回 8


reverse(x)

-x

解析:
返回 x 的相反数。例如,reverse(5) 将返回 -5


sign(x)

如果输入为 NaN,则返回 NaN。

解析:
返回 x 的符号。如果 x 为正数,返回 1;如果为负数,返回 -1;如果为零,返回 0。如果 x 是 NaN,则返回 NaN。


signed_power(x, y)

x 提升到 y 次方,并保持 x 的符号。

解析:
计算 xy 次方,同时保留 x 的正负号。例如,signed_power(-2, 3) 将返回 -8


subtract(x, y, filter=false), x - y

xy。如果 filter = true,则在相减前将所有输入的 NaN 过滤为 0

解析:
执行减法运算,将 yx 中减去。如果 filter 参数设置为 true,则在相减之前,将所有 NaN 值替换为 0


逻辑运算符(Logical Operators)

and(input1, input2)

逻辑与运算符,如果两个操作数都为真,则返回真,否则返回假。

解析:
执行逻辑与操作,仅当所有输入均为真(通常表示为 1)时,结果为真;否则为假(0)。


if_else(input1, input2, input3)

如果 input1 为真,则返回 input2,否则返回 input3

解析:
类似于编程语言中的三元运算符,用于根据条件选择不同的值。


input1 < input2

如果 input1 小于 input2,则返回真,否则返回假。

解析:
执行小于比较操作,用于判断一个值是否小于另一个值。


input1 <= input2

如果 input1 小于或等于 input2,则返回真,否则返回假。

解析:
执行小于等于比较操作,用于判断一个值是否小于或等于另一个值。


input1 == input2

如果两个输入相同,则返回真,否则返回假。

解析:
执行等于比较操作,用于判断两个值是否相等。


input1 > input2

逻辑比较运算符,用于比较两个输入。

解析:
执行大于比较操作,用于判断一个值是否大于另一个值。


input1 >= input2

如果 input1 大于或等于 input2,则返回真,否则返回假。

解析:
执行大于等于比较操作,用于判断一个值是否大于或等于另一个值。


input1 != input2

如果两个输入不相同,则返回真,否则返回假。

解析:
执行不等于比较操作,用于判断两个值是否不相等。


is_nan(input)

如果 input 为 NaN,则返回 1,否则返回 0

解析:
检查输入是否为 NaN(非数值),用于数据清洗和缺失值处理。


not(x)

返回 x 的逻辑非。如果 x 为真(1),则返回假(0);如果 x 为假(0),则返回真(1)。

解析:
执行逻辑非操作,用于反转布尔值。


or(input1, input2)

逻辑或运算符,如果任一或两个输入为真,则返回真,否则返回假。

解析:
执行逻辑或操作,只要有一个输入为真,结果就为真。


时间序列运算符(Time Series Operators)

days_from_last_change(x)

x 上次变化以来的天数。

解析:
计算当前天数与 x 上次发生变化的天数差,用于识别变化频率。


hump(x, hump = 0.01)

限制 x 的变化量和幅度(从而降低换手率)。

解析:
通过限制 x 的变化幅度,减少策略的频繁交易,降低换手率。


kth_element(x, d, k)

通过回溯 d 天返回 x 的第 k 个值。如果 k=1,可用于填补缺失数据。

解析:
在时间序列中查找第 k 个值,常用于数据填补和历史数据分析。


last_diff_value(x, d)

返回过去 d 天内最后一个与当前 x 不同的 x 值。

解析:
查找时间序列中最近一次 x 变化的值,用于识别最新的非重复数据点。


ts_arg_max(x, d)

返回过去 d 天时间序列中最大值的相对索引。如果当前天是最大值,返回 0;如果前一天是最大值,返回 1

解析:
确定过去 d 天内 x 的最大值出现的位置,用于识别时间窗口内的极值点。


ts_arg_min(x, d)

返回过去 d 天时间序列中最小值的相对索引。如果当前天是最小值,返回 0;如果前一天是最小值,返回 1

解析:
确定过去 d 天内 x 的最小值出现的位置,用于识别时间窗口内的极小值点。


ts_av_diff(x, d)

返回 x 减去过去 d 天的均值 (tsmean(x, d))。处理 NaN 值时,均值计算忽略 NaN。

解析:
衡量当前值相对于过去 d 天平均值的偏差,用于识别趋势和异常值。


ts_backfill(x, lookback = d, k=1, ignore="NAN")

回填过程,用有意义的值替换 NaN 或 0 值(即第一个非 NaN 值)。

解析:
填补时间序列中的缺失值,确保数据的连续性和完整性。


ts_corr(x, y, d)

返回过去 d 天内 xy 的相关性。

解析:
计算两个时间序列在指定时间窗口内的相关系数,用于分析它们之间的线性关系。


ts_count_nans(x, d)

返回过去 d 天内 x 的 NaN 值数量。

解析:
统计时间序列中缺失值的数量,用于数据质量评估和清洗。


ts_covariance(y, x, d)

返回过去 d 天内 yx 的协方差。

解析:
衡量两个时间序列在指定时间窗口内的协同变化程度,用于风险管理和多因子分析。


ts_decay_linear(x, d, dense = false)

返回过去 d 天内 x 的线性衰减值。dense=false 表示稀疏模式,将 NaN 视为 0dense=true 则不处理 NaN。

解析:
应用线性衰减函数,对时间序列数据进行加权,强调最近的数据点,降低较早数据的影响。


ts_delay(x, d)

返回 xd 天前的值。

解析:
获取时间序列中 d 天前的数据点,用于计算滞后指标和趋势分析。


ts_delta(x, d)

返回 x 减去 xd 天前的值。

解析:
计算时间序列中 x 的变化量,用于衡量增长或下降的幅度。


ts_mean(x, d)

返回过去 d 天内 x 的平均值。

解析:
计算时间序列在指定时间窗口内的平均值,用于识别趋势和中心倾向。


ts_product(x, d)

返回过去 d 天内 x 的乘积。

解析:
计算时间序列在指定时间窗口内所有值的乘积,用于特定的数学分析。


ts_quantile(x, d, driver="gaussian")

计算 ts_rank,并对其值应用由 driver 分布决定的逆累积分布函数。driver 可选为 "gaussian"(默认)、"uniform""cauchy"

解析:
将时间序列数据进行分位数转换,并根据指定的分布模型进行调整,用于标准化和概率分布分析。


ts_rank(x, d, constant = 0)

对过去 d 天内 x 的值进行排名,然后返回当前值的排名加上 constant。默认情况下,constant = 0

解析:
评估当前数据点在过去 d 天内的相对排名,用于趋势识别和排序策略。


ts_regression(y, x, d, lag = 0, rettype = 0)

返回与回归函数相关的各种参数。

解析:
执行时间序列回归分析,返回回归模型的参数,如斜率、截距、R² 等,用于预测和趋势分析。


ts_scale(x, d, constant = 0)

返回 (x - ts_min(x, d)) / (ts_max(x, d) - ts_min(x, d)) + constant。此操作符类似于缩放操作,但在时间序列空间中进行。

解析:
标准化时间序列数据,使其值在 [0, 1] 范围内波动,有助于比较不同时间窗口的数据。


ts_std_dev(x, d)

返回过去 d 天内 x 的标准差。

解析:
计算时间序列在指定时间窗口内的波动性,用于风险评估和趋势分析。


ts_step(1), step(1)

返回天数计数器。

解析:
用于计数时间序列中的天数,常用于循环或递增操作。


ts_sum(x, d)

返回过去 d 天内 x 的总和。

解析:
计算时间序列在指定时间窗口内的累积值,用于识别总体趋势和累计效果。


ts_zscore(x, d)

Z-score 是一种数值测量,描述一个值与一组值的均值的关系。Z-score 是以标准差为单位的离均差:(x - tsmean(x,d)) / tsstddev(x,d)。此操作符有助于减少异常值和回撤。

解析:
标准化时间序列数据,衡量当前值与过去 d 天平均值的偏差程度,有助于识别异常和趋势。


横截面运算符(Cross Sectional Operators)

normalize(x, useStd = false, limit = 0.0)

计算某日期所有有效 Alpha 值的平均值,然后从每个元素中减去该平均值。

解析:
对横截面数据进行均值归一化,消除整体偏移,使得各个 Alpha 值更具相对意义。


quantile(x, driver = gaussian, sigma = 1.0)

对原始向量进行排名,移动排名后的 Alpha 向量,并根据 driver 分布(gaussiancauchyuniform)应用逆累积分布函数。如果 driveruniform,则简单地将每个 Alpha 值减去所有 Alpha 值的均值。

解析:
将数据进行分位数转换,并根据指定的概率分布进行调整,用于标准化和概率分布分析。


rank(x, rate=2)

对输入在所有工具中进行排名,并返回一个在 0.01.0 之间均匀分布的数值。为了精确排序,可以将 rate 设置为 0

解析:
将数据进行排名并标准化到 [0, 1] 范围,用于量化模型中的排序和分布分析。


scale(x, scale=1, longscale=1, shortscale=1)

将输入按账面规模(booksize)进行缩放。可以通过指定额外参数来分别缩放多头和空头仓位。

解析:
对数据进行缩放处理,以适应不同的投资组合规模或仓位管理策略。


winsorize(x, std=4)

x 进行 Winsor 化,确保所有 x 的值都在指定的标准差倍数范围内。详细信息可查阅维基百科。

解析:
通过限制极端值(异常值)的影响,提高数据的稳健性,减少异常值对模型的干扰。


zscore(x)

Z-score 是一种数值测量,描述一个值与一组值的均值的关系。Z-score 是以标准差为单位的离均差。

解析:
标准化数据,使其均值为 0,标准差为 1,用于比较不同数据集或识别异常值。


向量运算符(Vector Operators)

vec_avg(x)

计算向量字段 x 的平均值。

解析:
对向量数据进行平均处理,用于获取整体趋势或中心值。


vec_sum(x)

计算向量字段 x 的总和。

解析:
对向量数据进行求和,用于累积值或整体量化分析。


变换运算符(Transformational Operators)

bucket(rank(x), range="0, 1, 0.1" 或者 buckets = "2,5,6,7,10")

将浮点值转换为用户指定桶的索引。桶操作符对于创建分组值非常有用,这些分组值可以作为输入传递给 GROUP

解析:
对数据进行分桶处理,将连续值转换为离散的类别,有助于分类和分组分析。


trade_when(x, y, z)

仅在指定条件下改变 Alpha 值,并在其他情况下保持 Alpha 值不变。还允许在指定条件下关闭 Alpha 仓位(分配 NaN 值)。

解析:
根据条件触发交易信号,控制 Alpha 值的变动和仓位管理,避免在不合适的时机进行交易。


分组运算符(Group Operators)

group_backfill(x, group, d, std = 4.0)

如果某个日期和工具的值为 NaN,则从同一组的工具中计算过去 d 天内所有非 NaN 值的 Winsor 化均值来填补。

解析:
在分组数据中填补缺失值,通过计算组内其他工具的统计值,提高数据的完整性和稳健性。


group_mean(x, weight, group)

组内所有元素的加权平均值。

解析:
计算分组数据的加权均值,用于识别组内的中心趋势和比较工具间的表现。


group_neutralize(x, group)

对 Alpha 进行组中性化处理。组可以是子行业、行业、部门、国家或常数。

解析:
消除组内的共同因素影响,使 Alpha 值更能反映工具的独特表现,减少组间的系统性偏差。


group_rank(x, group)

为组内的每个元素分配相应的排名。

解析:
在指定分组内对数据进行排序,生成相对排名,用于横截面分析和策略优化。


group_zscore(x, group)

计算组内的 Z-score,即描述一个值相对于组内均值的关系。Z-score 是以标准差为单位的离均差。

解析:
在分组数据中标准化 Alpha 值,衡量每个工具相对于其组的表现,有助于识别相对强势或弱势工具。



总结

上述操作符涵盖了从基础的算术和逻辑运算,到复杂的时间序列和分组处理。这些操作符在量化分析和策略开发中起到关键作用,帮助分析师和交易者对数据进行各种计算、标准化、过滤和转换,以构建有效的投资模型和策略。

关键点:

  1. 算术运算符:用于基本的数学计算,如加减乘除、对数、幂运算等。
  2. 逻辑运算符:用于条件判断和布尔逻辑操作,支持复杂的决策逻辑。
  3. 时间序列运算符:专门处理时间序列数据,支持滞后、差分、移动平均、回归等操作。
  4. 横截面运算符:处理横截面数据,支持排名、归一化、标准化等。
  5. 向量运算符:处理向量数据,支持求平均、求和等。
  6. 变换运算符:用于数据的分类和分桶,支持将连续数据转换为离散类别。
  7. 分组运算符:支持基于组的计算和标准化,消除组间的系统性偏差。

通过合理使用这些操作符,可以构建出复杂而高效的量化策略,提升投资组合的表现和风险控制能力。

如果你有具体的操作符需要进一步解析或在策略中如何应用的疑问,请随时告知!