分享

代码发布:新因子表达式引擎,支持生成“逆波兰”因子以及因子挖掘的强化学习环境

 AI量化实验室 2024-04-26 发布于北京

原创文章第522篇,专注“AI量化投资、世界运行的规律、个人成长与财富自由"。

重构后的因子表达式体系下,刷新了一轮策略

大家可以自行下载代码运行测试:

策略代码如下:

本周代码更新细节:

1、因子表达式重构:分成unary(一元), binary(二元), unaryrolling(一元滑动),binaryrolling(二元滑动)。结构更清晰,更重要的是,后续与gplearn/ deepalpha因子挖掘框架复用。

2、因子表达式的构建(构建一棵逆波兰表达式):

3、导入强化学习环境(下周代码正式使用强化学习挖掘因子):

from typing import Tuple, Optional
import gymnasium as gym
import math

from alphagen.config import MAX_EXPR_LENGTH
from alphagen.data.tokens import *
from alphagen.data.expression import *
from alphagen.data.tree import ExpressionBuilder
from alphagen.models.alpha_pool import AlphaPoolBase, AlphaPool
from alphagen.utils import reseed_everything


class AlphaEnvCore(gym.Env):
pool: AlphaPoolBase
_tokens: List[Token]
_builder: ExpressionBuilder
_print_expr: bool

def __init__(self,
pool: AlphaPoolBase,
device: torch.device = torch.device('cuda:0'),
print_expr: bool = False
):
super().__init__()

self.pool = pool
self._print_expr = print_expr
self._device = device

self.eval_cnt = 0

self.render_mode = None

def reset(
self, *,
seed: Optional[int] = None,
return_info: bool = False,
options: Optional[dict] = None
) -> Tuple[List[Token], dict]:
reseed_everything(seed)
self._tokens = [BEG_TOKEN]
self._builder = ExpressionBuilder()
return self._tokens, self._valid_action_types()

def step(self, action: Token) -> Tuple[List[Token], float, bool, bool, dict]:
if (isinstance(action, SequenceIndicatorToken) and
action.indicator == SequenceIndicatorType.SEP):
reward = self._evaluate()
done = True
elif len(self._tokens) < MAX_EXPR_LENGTH:
self._tokens.append(action)
self._builder.add_token(action)
done = False
reward = 0.0
else:
done = True
reward = self._evaluate() if self._builder.is_valid() else -1.

if math.isnan(reward):
reward = 0.

truncated = False # Fk gymnasium
return self._tokens, reward, done, truncated, self._valid_action_types()

def _evaluate(self):
expr: Expression = self._builder.get_tree()
if self._print_expr:
print(expr)
try:
ret = self.pool.try_new_expr(expr)
self.eval_cnt += 1
return ret
except OutOfDataRangeError:
return 0.

def _valid_action_types(self) -> dict:
valid_op_unary = self._builder.validate_op(UnaryOperator)
valid_op_binary = self._builder.validate_op(BinaryOperator)
valid_op_rolling = self._builder.validate_op(RollingOperator)
valid_op_pair_rolling = self._builder.validate_op(PairRollingOperator)

valid_op = valid_op_unary or valid_op_binary or valid_op_rolling or valid_op_pair_rolling
valid_dt = self._builder.validate_dt()
valid_const = self._builder.validate_const()
valid_feature = self._builder.validate_feature()
valid_stop = self._builder.is_valid()

ret = {
'select': [valid_op, valid_feature, valid_const, valid_dt, valid_stop],
'op': {
UnaryOperator: valid_op_unary,
BinaryOperator: valid_op_binary,
RollingOperator: valid_op_rolling,
PairRollingOperator: valid_op_pair_rolling
}
}
return ret

def valid_action_types(self) -> dict:
return self._valid_action_types()

def render(self, mode='human'):
pass

代码已经更新:

AI量化实验室——2024量化投资的星辰大海

热门ETF一共149支,日线,每个symbol一个csv,下载好打包,大家可以前往下载使用。

吾日三省吾身

AI量化投资一共几件事: 数据、因子、策略、量化回测系统,实盘对接、风控。

前四个部分陆陆续续都在完成(提供了源代码和数据),同时我们把这些模块整合到一个大的平台里。

只做当下最重要的事情——完成了这件事,其他 事情会变得容易甚至不重要。

之于AI量化投资,除了数据之外,最重要就是因子,因子加上机器模型基本就等同于策略

因此,因子挖掘框架,策略可视化配置是当下最重要的事情。

历史文章:

强化学习DeepAlpha之“逆波兰表达式”,去除qlib依赖(代码+数据)

AI量化实验室——2024量化投资的星辰大海

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多