原创文章第117篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。
北京疫情昨天突破4000,社会面800+。看来三天的预期过于乐观了,不知道如何发展。如同资本市场的短期走势,没有人可以预测。但往前看三年,相信一切现在看来天大的事,都不再是问题。
继续优化我们的AI量化平台。
01 dataloader加缓存
dataloader做数据特征工程与数据自动标注。因子一多,计算量较大,每次启动都计算一次,影响效率,我们可以借助hdf5存储dataframe的能力,把计算好的因子与标注结果存储起来,下一次直接从缓存里加载。
数据加载器从数据库、csv文件或者hdf5存储格式中读取数据,通常是一个个symbol对应的时间序列数据,以pandas的dataframe的格式加载入内存。而后使用表达式管理器对特征进行计算,并保存到对应的dataframe里。
# encoding:utf8 import pandas as pd from loguru import logger from engine.datafeed.expr.expr_mgr import ExprMgr from engine.datafeed.datafeed_hdf5 import Hdf5DataFeed from engine.config import DATA_DIR_HDF5_CACHE class Dataloader: def __init__(self, symbols, names, fields, load_from_cache=False): self.expr = ExprMgr() self.feed = Hdf5DataFeed() self.symbols = symbols self.names = names self.fields = fields with pd.HDFStore(DATA_DIR_HDF5_CACHE.resolve()) as store: key = 'features' if load_from_cache and '/' + key in store.keys(): # 注意判断keys需要前面加“/” logger.info('从缓存中加载...') self.data = store[key] else: self.data = self.load_one_df() store[key] = self.data def load_one_df(self): dfs = self.load_dfs() all = pd.concat(dfs) all.sort_index(ascending=True, inplace=True) all.dropna(inplace=True) self.data = all return all def load_dfs(self): dfs = [] for code in self.symbols: # 直接在内存里加上字段,方便复用 df = self.feed.get_df(code) for name, field in zip(self.names, self.fields): exp = self.expr.get_expression(field) # 这里可能返回多个序列 se = exp.load(code) if type(se) is pd.Series: df[name] = se if type(se) is tuple: for i in range(len(se)): df[name + '_' + se[i].name] = se[i] df['code'] = code dfs.append(df) return dfs
dataloader接受4个参数:symbols, names, fields和load_from_cache。
symbols:需要加载的证券列表。
names: 特征名称。
fields: 因子表达式列表。
load_from_cache:是否从缓存中加载。
Load_dfs,按symbol进行遍历。每一个symbol原始dataframe读入内存后,对names和fields需要计算的特征列,计算因子值,并保存到datafram里。
Load_one_df把load_dfs返回的多个dataframes合并成一个dataframe返回,并保存到缓存中备用。
02 随机森林升级为boosting GBDT
from sklearn.ensemble import RandomForestRegressor,AdaBoostRegressor,HistGradientBoostingRegressor e.add_model(SklearnModel(AdaBoostRegressor()), split_date='2020-01-01', feature_names=feature_names)
GBDT的几大算法都有类似的sklearn的接口。
03 Keras深度学习框架
深度学习是当下最前沿的人工智能技术之一。但深度学习比起传统机器学习,比如sklearn框架,学习门槛要高得多。深度学习需要使用者自己搭建网络结构,设定学习率,选择优化目标函数等。功能灵活且强大,学习曲线也高。
最热门的两个深度学习框架当属factbook的pytorch和google的tensorflow。纯粹比较两个框架而言,pytorch的学习曲线要比tensorflow低得多,但仍然要求初学者有矩阵运算,微积分等的数学知识。
Keras的出现,大幅降低的tensorflow的使用门槛。
Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的成本把你的想法转换为实验结果,是做好研究的关键。
官方给出的使用场景:
·允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。
·同时支持卷积神经网络和循环神经网络,以及两者的组合。
·在 CPU 和 GPU 上无缝运行。
Keras最大的优点就是简单而快速的原型设计,这一点对于初学者非常重要。我们的目标是量化投资,把深度学习应用于量化,而不是研究深度学习细节本身,所以,能够最小代价满足我们的诉求是关键。后续选择深度强化学习的框架也同样遵从这样的原则。
keras内置数据集:
数据转换:把N个28*28的数据,转为N*784的二维数据:
标签转为one hot的格式:
真正建模的代码很短:
10个epochs,准确率为92%。
近期文章:
ETF轮动+RSRS择时,加上卡曼滤波:年化48.41%,夏普比1.89