原创文章第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,sum是python内置函数 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量化投资的星辰大海
|