|
dataloader从本地目录读取csv集合,并使用因子表达式引擎计算。
[color=rgba(0, 0, 0, 0.9)]
读csv的逻辑比较好理解,重点讲一下:calc_expr,计算因子表达式, 表达式是fields传入的,比如['roc(close,20)'], names是字段名,与fields对应,比如['']
- def calc_expr(df: pd.DataFrame, fields, names):
- cols = []
- count = 0
- df.set_index([df.index, 'symbol'], inplace=True)
- for field, name in tqdm(zip(fields, names)):
- se = calc_expr(df, field)
- count += 1
- if count < 10:
- df[name] = se
- else:
- se.name = name
- cols.append(se)
- if len(cols):
- df_cols = pd.concat(cols, axis=1)
- df = pd.concat([df, df_cols], axis=1)
- # df_all = df.loc[self.start_date: self.end_date].copy()
- # print(df_all.index.levels[0])
- df['symbol'] = df.index.droplevel(0)
- # df_all['symbol'] = df_all.index.levels[0]
- df.index = df.index.droplevel(1)
- return df
复制代码 每一个dataframe,循环调用 calc_expr
- def calc_expr(df: pd.DataFrame, expr: str): # correlation(rank(open),rank(volume))
- # 列若存在,就直接返回
- if expr in list(df.columns):
- return df[expr]
- expr = expr_transform(df, expr)
- # try:
- se = eval(expr)
- return se
- # except:
- # import traceback
- # traceback.print_exc()
- # raise NameError('{}——eval异常'.format(expr))
- # shift(close,1) -> shift(df['close'],1)
- return None
复制代码 注意这里的 eval(expr),就是使用python的eval函数,来执行 “roc(close,20)”这样的表达式。
重点来的,roc在哪里定义?
- from .expr_unary import *
- from .expr_binary import *
- from .expr_unary_rolling import *
- from .expr_binary_rolling import *
- from .expr_funcs_talib import *
复制代码 这里导入所有的函数:(roc函数定义就在expr_unary_rolling,即一元滑动窗口函数)
- @calc_by_symbol
- def roc(se: pd.Series, N):
- return se / shift(se, N) - 1
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?免费注册
×
|