You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
15 KiB
198 lines
15 KiB
任务指令
|
|
算法交易足迹识别因子
|
|
[[假设]]
|
|
市场中算法交易占比日益提升,其交易行为会留下独特的“足迹”——例如订单流的微观聚类、撤单率的特定模式、以及价量关系中的非线性特征。这些足迹往往预示着短暂的流动性失衡或程序化交易的集体行为,可为短期价格方向提供预测信号。当算法交易足迹在特定股票中密集出现时,可能表明该股票正受到量化策略的集中关注,其价格波动可能脱离基本面,创造套利机会。
|
|
|
|
[[实施方案]]
|
|
使用高频价量数据构建三个核心指标:
|
|
|
|
订单流聚类度:计算每分钟内同向订单(买/卖)的时间间隔分布熵值,低熵值表示订单高度集中,可能为算法交易特征
|
|
|
|
撤单攻击率:测量价格关键位附近的高频撤单比例(撤单量/总挂单量)
|
|
|
|
量价非线性相关系数:使用互信息方法计算成交量变化与价格变动的非线性关联强度
|
|
|
|
综合信号生成:
|
|
|
|
当订单流聚类度<阈值A、撤单攻击率>阈值B、且量价非线性系数>阈值C时,标记为“算法交易活跃期”
|
|
|
|
在活跃期内,若订单流方向为净买入,则建立短期多头仓位;若为净卖出,则建立空头仓位
|
|
|
|
持仓周期:1-3个交易日,使用ts_backfill确保高频数据连续性
|
|
|
|
[[实施优化建议]]
|
|
建议引入机器学习分类器(如随机森林或梯度提升树)动态识别算法交易模式,替代固定阈值。可使用过去30天的数据训练分类器,实时判断当前市场状态是否为“算法驱动行情”。同时,可结合trade_when算子,仅在市场整体算法交易占比超过日平均水平时启用该因子,以提升策略特异性。
|
|
|
|
*=========================================================================================*
|
|
输出格式:
|
|
输出必须是且仅是纯文本。
|
|
每一行是一个完整、独立、语法正确的WebSim表达式。
|
|
严禁任何形式的解释、编号、标点包裹(如引号)、Markdown格式或额外文本。
|
|
===================== !!! 重点(输出方式) !!! =====================
|
|
现在,请严格遵守以上所有规则,开始生成可立即在WebSim中运行的复合因子表达式。
|
|
**输出格式**(一行一个表达式, 每个表达式中间需要添加一个空行, 只要表达式本身, 不需要赋值, 不要解释, 不需要序号, 也不要输出多余的东西):
|
|
表达式
|
|
表达式
|
|
表达式
|
|
...
|
|
表达式
|
|
=================================================================
|
|
重申:请确保所有表达式都使用WorldQuant WebSim平台函数,不要使用pandas、numpy或其他Python库函数。输出必须是一行有效的WQ表达式。
|
|
以下是我的账号有权限使用的操作符, 请严格按照操作符, 以及我提供的数据集, 进行生成,组合 20 个alpha:
|
|
|
|
以下是我的账号有权限使用的操作符, 请严格按照操作符, 进行生成,组合因子
|
|
|
|
========================= 操作符开始 =======================================注意: Operator: 后面的是操作符,
|
|
Description: 此字段后面的是操作符对应的描述或使用说明, Description字段后面的内容是使用说明, 不是操作符
|
|
特别注意!!!! 必须按照操作符字段Operator的使用说明生成 alphaOperator: abs(x)
|
|
Description: Absolute value of x
|
|
Operator: add(x, y, filter = false)
|
|
Description: Add all inputs (at least 2 inputs required). If filter = true, filter all input NaN to 0 before adding
|
|
Operator: densify(x)
|
|
Description: Converts a grouping field of many buckets into lesser number of only available buckets so as to make working with grouping fields computationally efficient
|
|
Operator: divide(x, y)
|
|
Description: x / y
|
|
Operator: inverse(x)
|
|
Description: 1 / x
|
|
Operator: log(x)
|
|
Description: Natural logarithm. For example: Log(high/low) uses natural logarithm of high/low ratio as stock weights.
|
|
Operator: max(x, y, ..)
|
|
Description: Maximum value of all inputs. At least 2 inputs are required
|
|
Operator: min(x, y ..)
|
|
Description: Minimum value of all inputs. At least 2 inputs are required
|
|
Operator: multiply(x ,y, ... , filter=false)
|
|
Description: Multiply all inputs. At least 2 inputs are required. Filter sets the NaN values to 1
|
|
Operator: power(x, y)
|
|
Description: x ^ y
|
|
Operator: reverse(x)
|
|
Description: - x
|
|
Operator: sign(x)
|
|
Description: if input > 0, return 1; if input < 0, return -1; if input = 0, return 0; if input = NaN, return NaN;
|
|
Operator: signed_power(x, y)
|
|
Description: x raised to the power of y such that final result preserves sign of x
|
|
Operator: sqrt(x)
|
|
Description: Square root of x
|
|
Operator: subtract(x, y, filter=false)
|
|
Description: x-y. If filter = true, filter all input NaN to 0 before subtracting
|
|
Operator: and(input1, input2)
|
|
Description: Logical AND operator, returns true if both operands are true and returns false otherwise
|
|
Operator: if_else(input1, input2, input 3)
|
|
Description: If input1 is true then return input2 else return input3.
|
|
Operator: input1 < input2
|
|
Description: If input1 < input2 return true, else return false
|
|
Operator: input1 <= input2
|
|
Description: Returns true if input1 <= input2, return false otherwise
|
|
Operator: input1 == input2
|
|
Description: Returns true if both inputs are same and returns false otherwise
|
|
Operator: input1 > input2
|
|
Description: Logic comparison operators to compares two inputs
|
|
Operator: input1 >= input2
|
|
Description: Returns true if input1 >= input2, return false otherwise
|
|
Operator: input1!= input2
|
|
Description: Returns true if both inputs are NOT the same and returns false otherwise
|
|
Operator: is_nan(input)
|
|
Description: If (input == NaN) return 1 else return 0
|
|
Operator: not(x)
|
|
Description: Returns the logical negation of x. If x is true (1), it returns false (0), and if input is false (0), it returns true (1).
|
|
Operator: or(input1, input2)
|
|
Description: Logical OR operator returns true if either or both inputs are true and returns false otherwise
|
|
Operator: days_from_last_change(x)
|
|
Description: Amount of days since last change of x
|
|
Operator: hump(x, hump = 0.01)
|
|
Description: Limits amount and magnitude of changes in input (thus reducing turnover)
|
|
Operator: kth_element(x, d, k)
|
|
Description: Returns K-th value of input by looking through lookback days. This operator can be used to backfill missing data if k=1
|
|
Operator: last_diff_value(x, d)
|
|
Description: Returns last x value not equal to current x value from last d days
|
|
Operator: ts_arg_max(x, d)
|
|
Description: Returns the relative index of the max value in the time series for the past d days. If the current day has the max value for the past d days, it returns 0. If previous day has the max value for the past d days, it returns 1
|
|
Operator: ts_arg_min(x, d)
|
|
Description: Returns the relative index of the min value in the time series for the past d days; If the current day has the min value for the past d days, it returns 0; If previous day has the min value for the past d days, it returns 1.
|
|
Operator: ts_av_diff(x, d)
|
|
Description: Returns x - tsmean(x, d), but deals with NaNs carefully. That is NaNs are ignored during mean computation
|
|
Operator: ts_backfill(x,lookback = d, k=1, ignore="NAN")
|
|
Description: Backfill is the process of replacing the NAN or 0 values by a meaningful value (i.e., a first non-NaN value)
|
|
Operator: ts_corr(x, y, d)
|
|
Description: Returns correlation of x and y for the past d days
|
|
Operator: ts_count_nans(x ,d)
|
|
Description: Returns the number of NaN values in x for the past d days
|
|
Operator: ts_covariance(y, x, d)
|
|
Description: Returns covariance of y and x for the past d days
|
|
Operator: ts_decay_linear(x, d, dense = false)
|
|
Description: Returns the linear decay on x for the past d days. Dense parameter=false means operator works in sparse mode and we treat NaN as 0. In dense mode we do not.
|
|
Operator: ts_delay(x, d)
|
|
Description: Returns x value d days ago
|
|
Operator: ts_delta(x, d)
|
|
Description: Returns x - ts_delay(x, d)
|
|
Operator: ts_mean(x, d)
|
|
Description: Returns average value of x for the past d days.
|
|
Operator: ts_product(x, d)
|
|
Description: Returns product of x for the past d days
|
|
Operator: ts_quantile(x,d, driver="gaussian" )
|
|
Description: It calculates ts_rank and apply to its value an inverse cumulative density function from driver distribution. Possible values of driver (optional ) are "gaussian", "uniform", "cauchy" distribution where "gaussian" is the default.
|
|
Operator: ts_rank(x, d, constant = 0)
|
|
Description: Rank the values of x for each instrument over the past d days, then return the rank of the current value + constant. If not specified, by default, constant = 0.
|
|
Operator: ts_regression(y, x, d, lag = 0, rettype = 0)
|
|
Description: Returns various parameters related to regression function
|
|
Operator: ts_scale(x, d, constant = 0)
|
|
Description: Returns (x - ts_min(x, d)) / (ts_max(x, d) - ts_min(x, d)) + constant. This operator is similar to scale down operator but acts in time series space
|
|
Operator: ts_std_dev(x, d)
|
|
Description: Returns standard deviation of x for the past d days
|
|
Operator: ts_step(1)
|
|
Description: Returns days' counter
|
|
Operator: ts_sum(x, d)
|
|
Description: Sum values of x for the past d days.
|
|
Operator: ts_zscore(x, d)
|
|
Description: Z-score is a numerical measurement that describes a value's relationship to the mean of a group of values. Z-score is measured in terms of standard deviations from the mean: (x - tsmean(x,d)) / tsstddev(x,d). This operator may help reduce outliers and drawdown.
|
|
Operator: normalize(x, useStd = false, limit = 0.0)
|
|
Description: Calculates the mean value of all valid alpha values for a certain date, then subtracts that mean from each element
|
|
Operator: quantile(x, driver = gaussian, sigma = 1.0)
|
|
Description: Rank the raw vector, shift the ranked Alpha vector, apply distribution (gaussian, cauchy, uniform). If driver is uniform, it simply subtract each Alpha value with the mean of all Alpha values in the Alpha vector
|
|
Operator: rank(x, rate=2)
|
|
Description: Ranks the input among all the instruments and returns an equally distributed number between 0.0 and 1.0. For precise sort, use the rate as 0
|
|
Operator: scale(x, scale=1, longscale=1, shortscale=1)
|
|
Description: Scales input to booksize. We can also scale the long positions and short positions to separate scales by mentioning additional parameters to the operator
|
|
Operator: winsorize(x, std=4)
|
|
Description: Winsorizes x to make sure that all values in x are between the lower and upper limits, which are specified as multiple of std.
|
|
Operator: zscore(x)
|
|
Description: Z-score is a numerical measurement that describes a value's relationship to the mean of a group of values. Z-score is measured in terms of standard deviations from the mean
|
|
Operator: vec_avg(x)
|
|
Description: Taking mean of the vector field x
|
|
Operator: vec_sum(x)
|
|
Description: Sum of vector field x
|
|
Operator: bucket(rank(x), range="0, 1, 0.1" or buckets = "2,5,6,7,10")
|
|
Description: Convert float values into indexes for user-specified buckets. Bucket is useful for creating group values, which can be passed to GROUP as input
|
|
Operator: trade_when(x, y, z)
|
|
Description: Used in order to change Alpha values only under a specified condition and to hold Alpha values in other cases. It also allows to close Alpha positions (assign NaN values) under a specified condition
|
|
Operator: group_backfill(x, group, d, std = 4.0)
|
|
Description: If a certain value for a certain date and instrument is NaN, from the set of same group instruments, calculate winsorized mean of all non-NaN values over last d days
|
|
Operator: group_mean(x, weight, group)
|
|
Description: All elements in group equals to the mean
|
|
Operator: group_neutralize(x, group)
|
|
Description: Neutralizes Alpha against groups. These groups can be subindustry, industry, sector, country or a constant
|
|
Operator: group_rank(x, group)
|
|
Description: Each elements in a group is assigned the corresponding rank in this group
|
|
Operator: group_scale(x, group)
|
|
Description: Normalizes the values in a group to be between 0 and 1. (x - groupmin) / (groupmax - groupmin)
|
|
Operator: group_zscore(x, group)
|
|
Description: Calculates group Z-score - numerical measurement that describes a value's relationship to the mean of a group of values. Z-score is measured in terms of standard deviations from the mean. zscore = (data - mean) / stddev of x for each instrument within its group.
|
|
========================= 操作符结束 =======================================
|
|
|
|
========================= 数据字段开始 =======================================
|
|
注意: data_set_name: 后面的是数据字段(可以使用), description: 此字段后面的是数据字段对应的描述或使用说明(不能使用), description_cn字段后面的内容是中文使用说明(不能使用)
|
|
|
|
{'id': '15', 'data_set_name': 'forward_price_120', 'description': 'Forward price at 120 days derived from a synthetic long option with payoff similar to long stock + option dynamics. Combination of long ATM call and short ATM put.', 'description_cn': '行权价格_120天_合成多头看涨期权_ATM看涨+看跌动态_long_ATM看涨_short_ATM看跌'}
|
|
{'id': '473', 'data_set_name': 'fnd6_newqeventv110_cibegniq', 'description': 'Comp Inc - Beginning Net Income', 'description_cn': 'comp_inc_beginning_net_income'}
|
|
{'id': '623', 'data_set_name': 'fnd6_newqeventv110_spcedpq', 'description': 'S&P Core Earnings EPS Diluted - Preliminary', 'description_cn': 'SP_Core_Earnings_EPS_Diluted_Preliminary'}
|
|
{'id': '629', 'data_set_name': 'fnd6_newqeventv110_spcep12', 'description': 'S&P Core Earnings 12MM - Preliminary', 'description_cn': '标普核心 earnings 12个月 - 预liminary'}
|
|
{'id': '691', 'data_set_name': 'fnd6_newqv1300_cipenq', 'description': 'Comp Inc - Minimum Pension Adj', 'description_cn': '-comp_inc_min_pension_adj'}
|
|
{'id': '775', 'data_set_name': 'fnd6_newqv1300_spceepsp12', 'description': 'S&P Core 12MM EPS - Basic - Preliminary', 'description_cn': 'S&P_core_12MM_EPS_Basic_Preliminary'}
|
|
{'id': '1000', 'data_set_name': 'multi_factor_acceleration_score_derivative', 'description': 'Change in the acceleration of multi-factor score compared to previous period.', 'description_cn': '多因子评分加速度变化 Compared_to_Previous_Period_Multi_Factor_Score_Acceleration_Change'}
|
|
{'id': '1292', 'data_set_name': 'anl4_netdebt_flag', 'description': 'Net debt - forecast type (revision/new/...)', 'description_cn': '净负债-预测类型(修正值/新值/....ImageAlign\n<|im_start|>user\nstrike price'}
|
|
{'id': '1927', 'data_set_name': 'news_max_up_amt', 'description': 'The after the news high minus the price at the time of the news', 'description_cn': '新闻后 highs 减去 新闻时 price 的差值'}
|
|
{'id': '2015', 'data_set_name': 'nws12_afterhsz_allticks', 'description': 'Total number of ticks for the trading day', 'description_cn': '当日交易总tick数'}
|
|
{'id': '2101', 'data_set_name': 'nws12_mainz_allticks', 'description': 'Total number of ticks for the trading day', 'description_cn': '当日交易总tick数'}
|
|
{'id': '2153', 'data_set_name': 'nws12_prez_02p', 'description': 'The minimum of L or S above for 20-minute bucket', 'description_cn': '20分钟桶上限值(min_of_L_or_S)'}
|
|
========================= 数据字段结束 =======================================
|
|
|
|
以上数据字段和操作符, 按照Description说明组合, 但是每一个 alpha 组合的使用的数据字段和操作符不要过于集中, 在符合语法的情况下, 多尝试不同的组合 |