AI量化实验室

 找回密码
 免费注册
查看: 1612|回复: 15

Quantlab代码结构讲解:datafeed数据加载与因子表达式。

[复制链接]

86

主题

183

帖子

958

积分

管理员

积分
958
发表于 2024-7-28 08:26:56 | 显示全部楼层 |阅读模式
dataloader从本地目录读取csv集合,并使用因子表达式引擎计算。
[color=rgba(0, 0, 0, 0.9)]

读csv的逻辑比较好理解,重点讲一下:calc_expr,计算因子表达式, 表达式是fields传入的,比如['roc(close,20)'], names是字段名,与fields对应,比如['']
  1. def calc_expr(df: pd.DataFrame, fields, names):
  2.         cols = []
  3.         count = 0
  4.         df.set_index([df.index, 'symbol'], inplace=True)
  5.         for field, name in tqdm(zip(fields, names)):
  6.             se = calc_expr(df, field)
  7.             count += 1
  8.             if count < 10:
  9.                 df[name] = se
  10.             else:
  11.                 se.name = name
  12.                 cols.append(se)
  13.         if len(cols):
  14.             df_cols = pd.concat(cols, axis=1)
  15.             df = pd.concat([df, df_cols], axis=1)

  16.         # df_all = df.loc[self.start_date: self.end_date].copy()
  17.         # print(df_all.index.levels[0])
  18.         df['symbol'] = df.index.droplevel(0)
  19.         # df_all['symbol'] = df_all.index.levels[0]
  20.         df.index = df.index.droplevel(1)
  21.         return df
复制代码
每一个dataframe,循环调用 calc_expr
  1. def calc_expr(df: pd.DataFrame, expr: str):  # correlation(rank(open),rank(volume))
  2.     # 列若存在,就直接返回
  3.     if expr in list(df.columns):
  4.         return df[expr]

  5.     expr = expr_transform(df, expr)

  6.     # try:
  7.     se = eval(expr)
  8.     return se
  9.     # except:
  10.     # import traceback
  11.     # traceback.print_exc()
  12.     # raise NameError('{}——eval异常'.format(expr))
  13.     # shift(close,1) -> shift(df['close'],1)
  14.     return None
复制代码
注意这里的 eval(expr),就是使用python的eval函数,来执行 “roc(close,20)”这样的表达式。
重点来的,roc在哪里定义?



  1. from .expr_unary import *
  2. from .expr_binary import *
  3. from .expr_unary_rolling import *
  4. from .expr_binary_rolling import *
  5. from .expr_funcs_talib import *
复制代码
这里导入所有的函数:(roc函数定义就在expr_unary_rolling,即一元滑动窗口函数)
  1. @calc_by_symbol
  2. def roc(se: pd.Series, N):
  3.     return se / shift(se, N) - 1
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?免费注册

×

0

主题

6

帖子

32

积分

量化新人

积分
32
发表于 2024-8-17 19:37:21 | 显示全部楼层
本帖最后由 18898757577 于 2024-8-17 19:42 编辑

请问一下这里初始化的这个因子表达式的中文在哪里加载的呢?@calc_by_symboldef ts_pct_change(se: pd.Series, N):
    return se / se.shift(N) - 1
比如这里定义的是两个参数,但是在那里加载的缺指定了需要的中文字段名称,这个是怎么做的对应呢?在哪里做的?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?免费注册

×

86

主题

183

帖子

958

积分

管理员

积分
958
 楼主| 发表于 2024-8-19 09:22:02 | 显示全部楼层
18898757577 发表于 2024-8-17 19:37
请问一下这里初始化的这个因子表达式的中文在哪里加载的呢?@calc_by_symboldef ts_pct_change(se: pd.Seri ...

调用的时候,我们是使用  ts_pct_change(close, 5),就是5日收益率。
ts_pct_change(open, 5)就是使用开盘价。

0

主题

6

帖子

32

积分

量化新人

积分
32
发表于 2024-8-19 09:38:55 | 显示全部楼层
ailabx 发表于 2024-8-19 09:22
调用的时候,我们是使用  ts_pct_change(close, 5),就是5日收益率。
ts_pct_change(open, 5)就是使用开 ...

我的意思是想问您,这些是在哪里调用的。比如: ts_pct_change(close, 5) 这个字符串在哪里加载进去的。我看到代码初始化的时候是invalid_ind这个参数,但是没理解到在哪里把这些expr_functions中的表达式加载到invalid_ind这个参数集里面的。因为expr_functions里面都是正常的表达式,其实invalid_ind里面其实是字符串是通过evl()把这些字符串转换成表达式的,我想知道这个中间是在哪里做的对应加载的。谢谢。

86

主题

183

帖子

958

积分

管理员

积分
958
 楼主| 发表于 2024-8-19 09:39:47 | 显示全部楼层
eval这个python函数是关键。

86

主题

183

帖子

958

积分

管理员

积分
958
 楼主| 发表于 2024-8-19 09:42:40 | 显示全部楼层
datafeed 目录 > expr.py > calc_expr > eval

0

主题

6

帖子

32

积分

量化新人

积分
32
发表于 2024-8-19 09:48:38 | 显示全部楼层
ailabx 发表于 2024-8-19 09:42
datafeed 目录 > expr.py > calc_expr > eval

不是这个问题,是初始化的时候。deap_mgr.py 中的def:map_exprs(里面的参数invalid_ind中这个参数的值从哪里初始化的。我看初始化了很多字符串的表达式,后面通过eval蒋字符串转换成表达式,我现在就是不知道这些字符串从哪里初始化到这个参数的。)

86

主题

183

帖子

958

积分

管理员

积分
958
 楼主| 发表于 2024-8-19 09:54:55 | 显示全部楼层
18898757577 发表于 2024-8-19 09:48
不是这个问题,是初始化的时候。deap_mgr.py 中的def:map_exprs(里面的参数invalid_ind中这个参数的值从 ...

这是遗传算法生成的。

0

主题

6

帖子

32

积分

量化新人

积分
32
发表于 2024-8-19 10:14:22 | 显示全部楼层
ailabx 发表于 2024-8-19 09:54
这是遗传算法生成的。

    pset.addPrimitive(dummy, [Expr, Expr], Expr, name='fadd')
    pset.addPrimitive(dummy, [Expr, Expr], Expr, name='fsub')
    pset.addPrimitive(dummy, [Expr, Expr], Expr, name='fmul')
    pset.addPrimitive(dummy, [Expr, Expr], Expr, name='fdiv')

麻烦问下这些基础算子的是什么意思?这些名字代表什么计算方式?我看后面基本没用到计算。

0

主题

6

帖子

32

积分

量化新人

积分
32
发表于 2024-8-19 11:02:05 | 显示全部楼层

无无无

本帖最后由 18898757577 于 2024-8-19 11:06 编辑


111111111
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

AI量化实验室 ( 京ICP备16049031号-2 )

GMT+8, 2024-11-24 02:26 , Processed in 0.069423 second(s), 19 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表