分享

WorldQuant101因子集整合Quantlab表达式引擎

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

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

本周计划(源代码预计仍然是周五在星球发布):

1、复现world quant 101因子集。

2、这些函数集合与gplearn和Deep alpha复用。

3、行业数据集用于因子挖掘测试。

其他:数据梳理:dagster。

回测平台:streamlit。

在Quantlab里复现WorldQuant101因子表达式引擎(代码+数据)

函数集在如下位置, 因子集在worldquant101.py下:

from datafeed.expr_functions import *


class AlphaBase:
pass


# https://www./data/dict/alpha101
class WorldQuant101(AlphaBase):
def get_names_features(self):
names = []
features = []

# names.append('alpha001')
# features.append('(rank(ts_argmax(signed_power((stddev(returns, 20) if (returns < 0) else close), 2.), '
# '5)) - 0.5)')

names.append('alpha002')
features.append('(-1 * correlation(rank(delta(log(volume), 2)), rank(((close - open) / open)), 6))')

names.append('alpha003')
features.append('(-1 * correlation(rank(open), rank(volume), 10))')

names.append('alpha004')
features.append('(-1 * ts_rank(rank(low), 9))')

'''
Alpha#5: (rank((open - (sum(vwap, 10) / 10))) * (-1 * abs(rank((close - vwap)))))
Alpha#6: (-1 * correlation(open, volume, 10))
'''

names.append('alpha006')
features.append('(-1 * correlation(open, volume, 10))')

'''
Alpha#7: ((adv20 < volume) ? ((-1 * ts_rank(abs(delta(close, 7)), 60)) * sign(delta(close, 7))) : (-1 * 1))
Alpha#8: (-1 * rank(((sum(open, 5) * sum(returns, 5)) - delay((sum(open, 5) * sum(returns, 5)), 10))))
'''

# todo: 这里把sum替换成ts_sum,sumpython内置函数
names.append('alpha008')
features.append(
'(-1 * rank(((ts_sum(open, 5) * ts_sum(returns, 5)) - delay((ts_sum(open, 5) * ts_sum(returns, 5)), 10))))')

return names, features


if __name__ == '__main__':
from config import DATA_DIR
from datafeed.expr import calc_expr

names, features = WorldQuant101().get_names_features()
name = names[-1]
feature = features[-1]

dfs = []
for s in ['159915.SZ', '159920.SZ', '159934.SZ', '159967.SZ', '510050.SH', '510300.SH', '510500.SH', '510880.SH',
'512100.SH', '513100.SH']:
df = pd.read_csv(DATA_DIR.joinpath('universe').joinpath('20240415').joinpath('{}.csv'.format(s)).resolve())
dfs.append(df)
df_all = pd.concat(dfs)
df_all.set_index(['date', 'symbol'], inplace=True)
df_all.dropna(inplace=True)
df_all.sort_index(level=0, inplace=True)
df_all['returns'] = calc_expr(df_all, 'close/delay(close,1)-1')

print(df_all)
df_all[name] = calc_expr(df_all, feature)

print(df_all)

直接算了因子值:

我们规范了worldquant函数的命名,统一使用python的变量命名,比如ts_rank(x,d)。

基础函数就那么几十个,本周我们基本都会准备好:

import numpy as np
import pandas as pd
from .expr_utils import calc_by_symbol, calc_by_date


@calc_by_symbol
def delay(se: pd.Series, periods=5):
return se.shift(periods=periods)


@calc_by_symbol
def delta(se: pd.Series, periods=20):
se_result = se - se.shift(periods=periods)
return se_result


@calc_by_symbol
def ts_min(se: pd.Series, periods=5):
return se.rolling(periods=periods).min()


@calc_by_symbol
def ts_max(se: pd.Series, periods=5):
return se.rolling(periods=periods).max()


@calc_by_symbol
def ts_argmin(se: pd.Series, periods=5):
return se.rolling(periods=periods).argmin()


@calc_by_symbol
def ts_argmax(se: pd.Series, periods=5):
return se.rolling(periods=periods).argmax()


@calc_by_symbol
def stddev(se, periods=5):
return se.rolling(periods=periods).std()


@calc_by_date
def rank(se: pd.Series):
ret = se.rank(pct=True)
return ret


@calc_by_symbol
def ts_rank(se: pd.Series, periods=9):
ret = se.rolling(window=periods).rank(pct=True)
return ret


@calc_by_symbol
def sum(se: pd.Series, N):
return se.rolling(N).sum()


@calc_by_symbol
def shift(se: pd.Series, N):
return se.shift(N)


@calc_by_symbol
def roc(se: pd.Series, N):
return se / shift(se, N) - 1

这些函数后续会在 因子挖掘系统里直接复用,比如gplearn和DeepAlpha因子挖掘系统。

代码下载:

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

吾日三省吾身

想做的事情太多,学会专注。

专注就是有所取舍,做最有价值的事情,同时又是自己喜欢且擅长的。

人生总有选。

星球最近的重要工作,是AI量化里的核心——因子挖掘。与gplearn的整合,强化学习因子挖掘框架的整合等。

当然还是量化回测平台,是给没有代码经验的新手同学准备的。帮助大家以最小代价了解量化,以及自己做出策略。

支撑的功能,比如数据也是不可或缺的。

历史文章:

在Quantlab里复现WorldQuant101因子表达式引擎(代码+数据)

年化25.2%,最大回撤28%RSRS择时的大类资产轮动

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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多