机器学习因子库及特征表达式,创业板布林带突破策略,年化13.3%(附代码)

news2024/11/16 1:55:28

原创文章第235篇,专注“个人成长与财富自由、世界运作的逻辑与投资"。

昨天有朋友留言说,L2R效果不好,当然我不知道这位兄弟的场景。

pybroker vs qlib

pybroker的结构里,有一个特别的地方:

无论是规则型策略,还是机器学习,它默认是按symbol独立分开的。

每个函数的context是当前这个symbol的。

我的积木式是使用了它的add_before_exec来完成的,这个传入的所有的ctxs。所以,我没有调用它的add_exec_fn函数还使用onbar这个函数。

机器模型也是,它是针对每个symbol,训练一个模型,我在想,如果4000支股票,这就训练了4000个模型。——它的思路就是每个symbol都是各玩各人。但这里不是对的。比如我们想整合排序学习,就是把所有symbol统一训练,然后对它们进行综合排序。

pybroker本身号称要兼容机器学习与传统量化,确实也是这么做的,还实现了WFA模式。可是竟然变成一个symbol一个model的模式,看来作者确实不太理解AI机器学习如何落地量化金融。

而qlib相反,它的传统规则量化非常弱,基本不支持写规则,ai模型出来之后,就一个topK轮动,比如要加一些择时就非常难。二者比较互补。我的计划就是取长补短,取它们优点的地方。

DataSource vs DataSet

pybroker的DataSource非常轻,我自己实现了一个从本地加载csv的,后续可以轻松扩展从hdf5,或者mongo的。pybroker近期还实现了akshare的DataSource,非常实用。

qlib使用了自己的“数据格式”,基本就是冲着高频去的,说实话,比较“鸡肋”。日频的数据量相对下,用不着。若真是高频场景,可以使用专业的解决方案,比如flink或spark等。

由于pybroker是一个symbol一个model,它没有qlib的dataset,可以直接提供数据给机器训练使用,因此,我们借用一下qlib的dataset相关的代码,包括预处理等。

我们的目标,就是数据实现自动标注,包括label,提供给模型训练之用。

参考qlib的Alpha158库。158个因子精简为15个因子,超额收益仍然接近10%

下面的alpha相当于是一个因子库:

所有代码已经发布至星球:我的开源项目及知识星球

class Alpha:
    def __init__(self):
        pass
    
    def get_feature_config(self):
        return self.parse_config_to_fields()

    def get_label_config(self):
        return ["shift(close, -2)/shift(close, -1) - 1"], ["label"]

    @staticmethod
    def parse_config_to_fields():
        # ['CORD30', 'STD30', 'CORR5', 'RESI10', 'CORD60', 'STD5', 'LOW0',
        # 'WVMA30', 'RESI5', 'ROC5', 'KSFT', 'STD20', 'RSV5', 'STD60', 'KLEN']
        fields = []
        names = []
        windows = [5, 10, 20, 30, 60]
        
        fields += ["corr(close/shift(close,1), log(volume/shift(volume, 1)+1), %d)" % d for d in windows]
        names += ["CORD%d" % d for d in windows]
        return fields, names

dataset使用它来对数据进行标注。

class DataSet:
    def __init__(self, handler=None):
        self.handler = handler

    def _process(self, df):
        if not self.handler:
            return df
        fields, names = self.handler.get_feature_config()
        label_fields, label_names = self.handler.get_label_config()

        for field, name in zip(fields, names):
            ind = to_indicator(name, field)
            df[name] = ind(df)

        for field, name in zip(label_fields, label_names):
            ind = to_indicator(name, field)
            df[name] = ind(df)
        return df

    def load(self, symbols, start_date='20100101', end_date=datetime.now().strftime('%Y%m%d')):
        dfs = []
        for s in symbols:
            # dirname去掉文件名,返回目录
            path = os.path.dirname(__file__)
            # print(path)
            df = pd.read_csv('{}/data/{}.csv'.format(path, s), dtype={'date': str})

            for col in ['open', 'high', 'low', 'close']:
                df[col] = df[col] / df[col][0]
            df.set_index('date', inplace=True)
            df.index = pd.to_datetime(df.index)
            df.sort_index(ascending=True, inplace=True)
            df = self._process(df)  # 如果有handler,同使用handler标注
            dfs.append(df)
        df = pd.concat(dfs)
        # df['date'] = pd.to_datetime(df['date'])
        df['swing'] = 1
        df.sort_index(ascending=True, inplace=True)
        return df[(df.index >= start_date) & (df.index <= end_date)]

使用Alpha这个handler,自动把因子和lable都标注好了。

机器模型

泛泛而言,机器学习在金融应用,效果可能很多时候不及一个简单的roc_20——动量策略在单边市被证明是真实有效的。而且规则型策略,我分分钟可以做一个出来,回测效果还不错的。

考虑机器学习多因子模型,是考虑它整合因子的能力,动态跟进市场的能力。当然不太可能,拿一个sklearn的demo fit一下,predict一样就可以得到一个高夏普的策略,那市场不就乱套了。金融数据低信噪比的特性,让其应用于金融投资尤其难。

从逻辑上讲,我觉得L2R是一个方面,另一个方向就是深度强化学习。而其它的提升就是找更多优质的数据,然后挖掘出更好的因子,如此而已。

StockRanker = 选股 + 排序学习 + 梯度提升树。按公开资料,bigquant是使用list wise learning to rank算法。

我们需要开发一个自己的“StockRanker”。

今天准备好数据,明天写模型——StockRanker。

今日策略——创业板布林带

今天写一个创业板布林带策略。

作为示例,规则也比较简单:

收盘价突破布林带上轨做多,突破下轨平仓。

这里我们需要扩展两个函数:cross_up, cross_down,向上突破和向上突破。

def cross_up(left, right):
    left = pd.Series(left)
    right = pd.Series(right)
    diff = left - right
    diff_shift = diff.shift(1)
    return (diff >=0) & (diff_shift <0)


def cross_down(left, right):
    left = pd.Series(left)
    right = pd.Series(right)
    diff = left - right
    diff_shift = diff.shift(1)
    return (diff <= 0) & (diff_shift > 0)

定义好的指标,策略一如继往的简单:

今天代码已经同步到星球。我的开源项目及知识星球

小结:

1、机器学习特征工程dataset。

2、创业板布林带突破策略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口测试 —— 接口测试的意义

1、接口测试的意义&#xff08;优势&#xff09; &#xff08;1&#xff09;更早的发现问题&#xff1a; 不少的测试资料中强调&#xff0c;测试应该更早的介入到项目开发中&#xff0c;因为越早的发现bug&#xff0c;修复的成本越低。 然而功能测试必须要等到系统提供可测试…

GoogleTest之Matchers的用法

目录 组合匹配Matcher的类型转换重载函数的匹配基于参数执行不同的Actions多个参数作为一个整体匹配将Matchers作为谓词使用Matcher汇总 组合匹配 组合某些匹配某些值&#xff0c;可以使用以下&#xff1a; Matcher使用描述AllOf(m1, m2, …, mn)参数必须匹配m1, … mnAllOfA…

大数据:spark内核调度,DAG,job,宽窄依赖,stage阶段,内存计算管道,并行度task数量

大数据&#xff1a;spark内核调度 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其s…

【测试开发】实训记录日志

软件测试系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 了解测试开发和软件测试 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 …

建模杂谈系列226 流程与对象

说明 鲁迅说&#xff1a;我家门前门前有两棵树&#xff0c;一棵是枣树&#xff0c;另一棵也是枣树。 从编程语言的角度&#xff0c;可以分为两大类&#xff08;面向过程或面向对象&#xff09;&#xff0c;可以参考这篇文章 文章的内容其实不多&#xff0c;我贴一下&#xff1…

spark入门 YARN模式(六)

一、背景 独立部署&#xff08;Standalone&#xff09;模式由 Spark 自身提供计算资源&#xff0c;无需其他框架提供资源。这 种方式降低了和其他第三方资源框架的耦合性&#xff0c;独立性非常强。但是你也要记住&#xff0c;Spark 主 要是计算框架&#xff0c;而不是资源调度…

CATIA软件各版本区别

之前有个朋友问catia v5r21和catia v5-6r 2011&#xff0c;有什么区别&#xff0c;是一样的吗&#xff1f; 众联亿诚才发现&#xff0c;很多朋友似乎看不懂CATIA各种版本各种型号&#xff0c;那么今天&#xff0c;众联亿诚就来详细解释一下&#xff0c;希望能帮助朋友们解答心…

苹果电脑磁盘诊断工具 SMART Utility for mac

SMART Utility for mac是一款Mac上磁盘诊断工具&#xff0c;能够自动检测磁盘的状态和错误情况&#xff0c;分析并提供错误报告,以直观的界面让用户可明确地知道自己的磁盘状况。SMART Utilitymac版支持普通硬盘HDD和固态硬盘SSD&#xff0c;能够显示出详细的磁盘信息&#xff…

版权中心改革之后,软著办理需要多少钱?

版权中心改革之后&#xff0c;软著办理需要多少钱&#xff1f; 众所周知版权中心2年改了3次&#xff0c;每次改革官费都会涨&#xff0c;最近一次是在4月份&#xff0c;官费涨了近一倍。 其实费用涨了还不算最坏的情况&#xff0c;主要是每次改革办理软著的难度都会增加很多。…

(antD)vue项目使用图标

(antD)vue项目使用图标 效果&#xff1a; <a-icon type"arrow-left" class"backBtn" v-if"cardDiv" click"backBtn" />.backBtn {color&#xff1a;#ccc;font-size: 20px;//图标大小 }

程序员爬虫Scrapy框架知识学习

Scrapy是一个Python编写的高级网络爬虫框架&#xff0c;它可以帮助开发者快速、高效地从网站上获取数据。以下是学习Scrapy框架的一些步骤和建议&#xff1a; 学习Python基础知识&#xff1a;Scrapy是用Python编写的&#xff0c;因此需要掌握Python的基础知识&#xff0c;包括语…

利用彩虹线课程中的知识来制作精美的渐变色块和彩虹字

彩虹字 像这样的效果,同样我们可以使用“渐变色”的技巧。来看下面如何操作 选中字体,然后鼠标右键选”设置型状格式“ 选择“渐变” 有两处决定了彩虹字的样式。 拖动的箭头,这个箭头代表“每一个段”显示的色彩,如我DEMO中的字体是“两段颜色”-蓝+黄组合出来的;角度,…

在本地环境搭建GPT项目

先看效果: 在本地环境搭建gpt项目 1.简介 忽略不能写 2.准备环境 Docker的介绍和安装 Docker是一个开源的容器化平台,它可以帮助开发者和运维人员轻松地构建、打包和部署应用程序。使用Docker,您可以将应用程序及其所有依赖项打包到一个称为容器的独立单元中,使其可…

创新与互动的科技盛宴:探索3DVR元宇宙赛博科技世界虚拟展

导语&#xff1a; 在现代科技迅猛发展的时代&#xff0c;3DVR元宇宙虚拟展厅为我们带来了一场前所未有的科技盛宴。特别是在赛博科技领域&#xff0c;它展现了一系列令人惊叹的优势、优点和实质性的作用&#xff0c;为客户带来了非凡的体验和无限的可能。 一&#xff0e;创新科…

在windows上用gpu训练paddleocr模型所有遇到的坑与解决办法

这里写自定义目录标题 1.首先拉取paddleocr源代码下载预训练模型2.开始训练更改yml配置文件 3.遇到的报错1.ModuleNotFoundError: No module named Polygon2.最难解决的No module named lanms3.ImportError: cannot import name _print_arguments from paddle.distributed.util…

利用scikit-plot可视化机器学习模型!

关注“Python专栏”微信公众号&#xff0c;回复暗号【面试大全】&#xff0c;立即领取面试题简历模板。 scikit-learn (sklearn)是Python环境下常见的机器学习库&#xff0c;包含了常见的分类、回归和聚类算法。在训练模型之后&#xff0c;常见的操作是对模型进行可视化&#…

这么坑?3年经验我要25K,结果只给15K····

2023找到一份满意的工作实在是太难了呀&#xff0c;面试了十几家公司&#xff0c;没有一个满意的offer 我的情况 大概介绍一下个人情况&#xff0c;女&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xf…

北漂5年终上岸,年薪40W并非遥不可及····

关于我&#xff0c;普通二本&#xff0c;非计算机专业&#xff0c;培训出身&#xff0c;北漂&#xff0c;五年多的工作经验&#xff0c;做过外包&#xff0c;中间有过频繁的跳槽经历&#xff0c;手工点点点为主&#xff0c;最近确认了新Offer&#xff0c;远程办公&#xff0c;涨…

C++ Release版软件 程序运行丢失MSVCR120D.dll的解决方法

软件在Debug模式下运行时正常的&#xff0c;但是切换到Release模式下就弹出错误提示&#xff1a;无法启动此程序&#xff0c;因为计算机中丢失MSVCR120D.dll。尝试重新安装该程序以解决此问题。 解决方法如下&#xff1a; 1、项目“属性”---->配置给为“Release”版本----&…

Python数据分析——教育平台的线上课程智能推荐策略(2020泰迪杯数据分析技能赛)

赛题背景&#xff1a;近年来&#xff0c;随着互联网与通信技术的高速发展&#xff0c;学习资源的建设与共享呈现出新的发展趋势&#xff0c;各种网课、慕课、直播课等层出不穷&#xff0c;各种在线教育平台和学习 应用纷纷涌现。尤其是 2020 年春季学期&#xff0c;受新冠疫情影…