Files
ProStock/src/factors/decorators.py

58 lines
1.5 KiB
Python
Raw Normal View History

"""函数装饰器 - 用于标记因子函数类型并自动注入 over 处理。
提供三种装饰器
- @time_series: 时序因子自动添加 .over("ts_code")
- @cross_section: 截面因子自动添加 .over("trade_date")
- @element_wise: 元素级运算不添加 over
"""
from functools import wraps
from typing import Callable
def time_series(func: Callable) -> Callable:
"""标记为时序因子,自动添加 .over('ts_code')。
用于 ts_* 函数 ts_mean, ts_std, ts_corr
每个时序计算都按股票代码分组防止跨股票串数据
"""
@wraps(func)
def wrapper(self, node):
expr = func(self, node)
return expr.over("ts_code")
wrapper._factor_type = "ts"
return wrapper
def cross_section(func: Callable) -> Callable:
"""标记为截面因子,自动添加 .over('trade_date')。
用于 cs_* 函数 cs_rank, cs_zscore
每个截面计算都按交易日分组在同一天的所有股票间计算
"""
@wraps(func)
def wrapper(self, node):
expr = func(self, node)
return expr.over("trade_date")
wrapper._factor_type = "cs"
return wrapper
def element_wise(func: Callable) -> Callable:
"""标记为元素级运算,不添加 over。
用于数学函数 log, exp, sqrt, cos, sin
这些函数对每个元素独立计算不需要分组
"""
@wraps(func)
def wrapper(self, node):
return func(self, node)
wrapper._factor_type = "element"
return wrapper