• dataloader重构与keras入门体验


    原创文章第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

  • 相关阅读:
    LeetCode 0754. 到达终点数字
    三、计算机体系结构——中央处理器
    Linux 解决wine启动winedows程序无法显示中文
    ElasticSearch学习
    Android 使用OpenCV实现实时人脸识别,并绘制到SurfaceView上
    Android Platform Architecture 安卓平台架构
    我开源了团队内部基于SpringBoot Web快速开发的API脚手架stater
    如何查看linux 服务器的内存容量
    手机厂商参与“百模大战”,vivo发布蓝心大模型
    css钟表数字样式
  • 原文地址:https://blog.csdn.net/weixin_38175458/article/details/128063239