原创文章第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量化投资的星辰大海
|