机器学习量化应用:用回归策略预测价格

2023-10-28

我们已经知道,监督学习主要就是分类和回归两种方法。本文以支持向量机(support vector machine,SVM)来说明,如何采取机器学习中回归方法来预测股票价格。这在传统量化中是根本不可能实现的,在机器学习领域却能达到50%以上的胜率。

1、支持向量机

支持向量机
支持向量机是一种监督学习算法,可用于分类和回归问题,如支持分类的 SVC和支持回归的SVR。这是20世纪90年代被开发出来的,直到现在,都是高性能算法的首选,在机器学习领域有极为广泛的应用。

核心思想
算法的核心思想是寻找最能将特征分离到不同域的超平面。它的理论根据就是,任何一个P维物体(空间)都可以被一个P-1 维的超平面分成两部分,就像我们可以用刀(二维平面)将西瓜(三维物体)分成两半。

术语概念
直接看图吧,我们要图中将红蓝点分开,应该怎么办吧呢。
在这里插入图片描述

决策边界
如图所示,红点和蓝点分别代表两类样本,二维空间中的超平面就是图中的黑色直线。如果一条直线可以让两类样本中的点到这条直线的最短距离取最大值,一般认为这条直线就是最稳定的分界线,在机器学习中我们称之为“决策边界”;
支持向量:而决定这条直线的点往往是由少数几个支撑点决定的,这些点称为支持向量。就是如下图中红线和蓝线穿过的点。而支持向量与决策边界之间的距离就叫做边距。

sklearn中如何使用
这里我们使用的是SVR,直接从sklearn中引用SVR模块就可以了

from sklearn import svm
sk_model =svm.SVR(kernel='linear')

这里只有一个关键参数,就是核(kernel)

  • 线性核
  • 多项式核
  • 高斯核

算法预测的原理
1)如果用机器学习的语言表述,我们根据已知的“特征”x1 和“标签”y ,通过“训练”得到一个反映两者线性关系的模型。
2)如果这种关系在未来一段时间内能够延续,那么任意给出一个股票当前时刻的特征因子x1,我们就可以“预测”该股票未来时刻的价格 ?̂ = ?0 +?1?1。
3)根据已有的特征和标签训练模型,使用新的特征进行预测,两者构成了监督学习最核心的两个环节。

2、策略描述

标的选择:沪深300指数
训练数据:2011~2016年共7年的日线数据
预测数据:基于训练出的模型,预测2017,2018,2019年每天的涨跌

数据描述
在这里插入图片描述
这个日线数据有以下的字段:
【ts_code】 股票或基金的代码,上证股票SH结尾,深证股票以SZ结尾
【trade_date】 交易日期
【open】 开盘价
【high】 最高价
【low】 最低价
【close】 收盘价
【change】 涨跌幅,复权之后的真实涨跌幅,保证准确

策略实现描述

  1. 计算当日~前20日的滚动收盘价,作为我们这里的特征,共21个特征
  2. 采用SVM中的SVR线性回归模型来进行训练
  3. 训练好模型后就可以用来预测第二天的收盘价
  4. 通过将预测到的明日收盘价来和明日开盘价比较,就可以得到涨跌预测
  5. 然后我们根据预测结果计算策略收益,用图形展示出来

3、代码实现

代码的基本实现步骤:

1.准备数据

index_data,features_train,labels_train= getStockData(“000300.SH”,20,‘20110101’,‘20161231’)

2.训练模型

sk_model = trainModel(features_train,labels_train)

3.验证测试集

index_test, features_test, labels_test = getStockData(“000300.SH”,20, ‘20170101’, ‘20171231’) predictData(sk_model,features_test,
labels_test,index_test)

下面是各个函数的具体实现
#数据获取和处理

  def getStockData(ts_code,bar_num,start_date,end_date):
            #1.读取数据
            index_data =  pd.read_csv(ts_code+'.csv',parse_dates=['trade_date'])   #parse_dates
            #选取字段
            index_data = index_data[['trade_date','close','open']]
            #按日期排序
            index_data.sort_values(by='trade_date', inplace=True)
            #设置日期索引
            index_data.set_index('trade_date', inplace=True)
            
            #2.特征处理
            #这里以当日收盘价和之前n天的收盘价作为特征
            for i in range(1,bar_num+1):
                index_data['close_'+str(i)] = index_data['close'].shift(i)            
            #去掉前面的空值
            index_data = index_data[bar_num:]
        
            #3.按日期截取
            index_data = index_data[(index_data.index>pd.to_datetime(start_date))&(index_data.index<pd.to_datetime(end_date))]
        
            #特征数据
            features_data = index_data[[x for x in index_data.columns if 'close' in x]]
            #标签数据
            # 回归问题的标签就是预测的股价,所以下一天的收盘价就是前一天的标签;
            labels_data = index_data['close'].shift(-1)  
             # 进行训练的数据里不能有nan值,因为这一个值对整体影响可以忽略,可以删除也可以填充,这里采用的填充
            labels_data.fillna(method='ffill', inplace=True) 
        
            return  index_data,features_data,labels_data

模型训练

def trainModel(features_train,label_train):
    #选择模型
    sk_model =svm.SVR(kernel='linear')
    #训练模型(执行大概需要几分钟时间)
    print("开始训练=========>")
    sk_model.fit(features_train,label_train)
    print("<========= 训练结束")
    return sk_model      

预测价格和计算收益

def predictData(sk_model,features_data,labels_data,base_data):
    #准备用列表方式构造新dataframe
    date_line = list(labels_data.index.strftime("%Y-%m-%d"))  # 日期序列 将timestamp转换成string
    next_close = list(labels_data)                 #明日的收盘价
    current_close = list(features_data['close'])   #取今日的收盘价
    next_open = list(base_data['open'].shift(-1))  #取明天的开盘价
    
    #预测价格
    predict = sk_model.predict(features_data)

    #训练结果评分
    # score = sk_model.score(predict, labels_data)
    # print('预测得分:%.4f'%score)

    # 预测的明日收盘价,转换成list
    predict = list(predict)

    #构造新的dataframe
    index_data = pd.DataFrame({'date': date_line, 'next_close': next_close,'next_predict':predict,'close':current_close,'next_open':next_open})
    print(index_data.head())
    print(index_data.columns)

    #计算持仓
    index_data['position'] = np.where(index_data['next_predict']>index_data['next_open']*(1+0.002),1,0)   #这里设置2/1000的滑点

    #模型收益计算和可视化
    index_data['PL'] = np.where(index_data['position']==1,(index_data['next_close']-index_data['next_open'])/index_data['next_open'],0)
    print(index_data.head())
    index_data['strategy'] = (index_data['PL'].shift(1) + 1).cumprod()
    index_data['baseline'] = (index_data['next_close'].pct_change() + 1).cumprod()
    index_data.dropna(inplace=True)
    print(index_data.head())

    # 绘制图形
    plt.plot(index_data['strategy'])
    plt.plot(index_data['baseline'])
    plt.legend(loc='best')
    # plt.savefig('1.jpg')
    plt.show()

4、策略效果

我们用的2011~2016年数据训练好的模型进行预测,下面看先一下对各个时期的预测结果。
1)对训练数据(2011~2016年)的测试
在这里插入图片描述
说明:这结果好到爆有没有,当然,这是训练数据,再好都没有意义的

2)对2017年数据测试
在这里插入图片描述
说明:这个效果也很不错,虽然收益率跟直接持有差不多,但是够平滑

3)对2018年数据测试
在这里插入图片描述
说明:这个效果就很明显了,在大盘大幅下跌的情况下保持了正收益。

5、总结

总的来看,这个策略效果还是不错的,但是要注意,只是这样的策略是完全无法用于实战的,本文只是展示了程序实现的逻辑和流程。
1)一方面,完全没有考虑交易费用、滑点等损耗。
2)另一方面,单纯用价格预测价格,特征太单一了,可靠性不高。

扩展练习

  • 选取长度的特征或不同的特征组合
  • 不用线性核,采用多项式核或高斯核
  • 不用支持向量回归,改用其他的回归算法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习量化应用:用回归策略预测价格 的相关文章

  • Python 3.0 使用turtle.onclick

    所以这是我的问题 我必须为我的计算机科学课程制作一张图片 而在海龟中进行估计确实令人沮丧 我计划使用 onclick 来显示我的位置 import turtle as t def getPos x y print x y return de
  • 如何在 PyCharm 中设置运行配置的默认工作目录

    当我想运行众多 python 脚本之一时 我点击运行 这会创建一个新的运行配置 该配置的工作目录是 python 脚本文件所在的文件夹 相反 它应该从项目范围的固定文件夹运行 我想以某种方式进行设置 但我真的不明白为什么 这有点奇怪 因为我
  • 使用 NaN 计算 numpy 数组中的移动平均值

    我正在尝试计算包含 NaN 的大型 numpy 数组中的移动平均值 目前我正在使用 import numpy as np def moving average a n 5 ret np cumsum a dtype float ret n
  • 最近的 AWS 区域的客户端 IP 地址

    Question 我想从客户端设备将一些数据上传到 AWS 但我想上传到最近的 AWS 区域的 S3 存储桶 同样 我希望能够从最近的区域下载 当然 我会在每个区域设置一个存储桶 我可以使用一个系统 它可以获取客户端的 IP 地址 然后确定
  • Flask:缓存静态文件(.js、.css)

    我真的找不到任何这方面的资源 那么如何将视图 函数的缓存与静态文件 即 css js 分开 我想将静态对象缓存一周 另一方面 我只需要缓存函数 视图几分钟 当我执行以下操作时 from flask ext cache import Cach
  • 使用 Tkinter 进行多线程 Python

    我用这些函数在画布上画小圆圈 这是绘制圆圈的函数 class Fourmis def init self can posx posy name radius self can can self largeur can int self ca
  • 从两个字典创建一个新列表

    这是一个关于Python的问题 我有以下字典列表 listA t 1 tid 2 gtm 3 c1 4 id 111 t 3 tid 4 gtm 3 c1 4 c2 5 id 222 t 1 tid 2 gtm 3 c1 4 c2 5 id
  • 为线条指定颜色

    我试图在 matplotlib 中绘制可变数量的行 其中 X Y 数据和颜色存储在 numpy 数组中 如下所示 有没有办法将颜色数组传递到绘图函数中 这样我就不必采取额外的步骤来单独为每条线分配颜色 我是否应该将 RGB 颜色数组转换为另
  • 显示多索引 pandas 数据帧的前 10 行

    我有一个多级索引 pandasDataFrame第一级在哪里year第二级是username 我只有一列已经按降序排序 我想显示每个索引级别 0 的前 2 行 我拥有的 count year username 2010 b 677 a 50
  • 如何判断Python对象是否是字符串?

    如何检查 Python 对象是否是字符串 常规字符串或 Unicode Python 2 Use isinstance obj basestring 对于要测试的对象obj Docs https docs python org 2 7 li
  • UTF-8 在 Python 日志记录中,如何?

    我正在尝试使用 Python 的日志记录包将 UTF 8 编码的字符串记录到文件中 作为一个玩具示例 import logging def logging test handler logging FileHandler home ted
  • 来自异常导入 PendingDeprecationWarning ModuleNotFoundError:没有名为“异常”的模块

    我正在尝试使用Python 创建一个word 文档 我在终端中 pip install python docx 我的代码如下所示 from docx import Document document Document document sa
  • 如何将多索引数据帧与单个索引数据帧连接?

    df1 的单个索引与 df2 的多索引的子级别匹配 两者都有相同的列 我想将 df1 的所有行和列复制到 df2 它类似于这个线程 将单索引 DataFrame 复制到多索引 DataFrame https stackoverflow co
  • Python 中的数据可用性图表

    我想知道Python是否有一些东西可以绘制具有多个变量的时间序列的数据可用性 下面显示了一个示例 取自Visavail js 时间数据可用性图表 https github com flrs visavail 1 description 以下
  • PyTorch 中的交叉熵

    交叉熵公式 但为什么下面给出loss 0 7437代替loss 0 since 1 log 1 0 import torch import torch nn as nn from torch autograd import Variable
  • Pygame 文本不渲染

    好的 我正在用 python 和 pygame 制作一个多项选择测验游戏 不过 我已经完成了开始屏幕并尝试制作问题屏幕 我根本不明白为什么文本不呈现 这是我的代码 enter pressed False random question ra
  • 如何从 Python 脚本捕获 Curl 的输出

    我想使用curl查找有关网页的信息 但在Python中 到目前为止我有这个 os system curl head www google com 如果我运行它 它会打印出 HTTP 1 1 200 OK Date Sun 15 Apr 20
  • 在Python中:检查文件修改时间是否早于特定日期时间

    我用 C 编写了以下代码来检查文件是否已过期 DateTime lastTimeModified file getLastTimeModified if lastTimeModified HasValue File does not exi
  • 仅在满足条件时添加到字典

    我在用urllib urlencode构建 Web POST 参数 但是有一些值我只想在除None为他们而存在 apple green orange orange params urllib urlencode apple apple or
  • Pandas:根据是否为 ​​NaN 来移动列

    我有一个像这样的数据框 phone number 1 clean phone number 2 clean phone number 3 clean NaN NaN 8546987 8316589 8751369 NaN 4569874 N

随机推荐

  • 处理告警“ warning #69-D integer conversion resulted in truncation”的方法

    今天分享一个常见的语法告警 就是实参与形参的类型参数对于不上 错误之处 首先我们先看一下告警提示 告警 c 49 warning 69 D integer conversion resulted in truncation 其翻译过来意思就
  • 二 动态SQL和多对一,一对多

    二 动态SQL和多对一 一对多 10 多对一处理 测试环境搭建 按照查询嵌套处理 子查询 按照结果嵌套处理 联表查询 11 一对多 按照结果嵌套处理 按照查询嵌套处理 小结 12 动态 SQL IF choose when otherwis
  • xpath下载安装——Python爬虫xpath插件下载安装(2023.8亲测可用!!)

    目录 1 免费下载插件链接 若失效评论区留言发送最新链接 2023 7亲测可用 2 安装插件 1 打开chrome浏览器页面 点击 右上角三个点 gt 扩展程序 gt 管理拓展程序 若没找到点更多工具 2 打开右上角开发者模式 3 将刚刚下
  • 关于maven创建java-web工程加载过慢如何解决问题

    如何解决maven创建java web工程加载过慢如何解决问题 在创建项目时在这个界面中 添加设置一组变量archetypeCatalog internal 然后点击完成继续创建就可以了 但是这样做每次创建项目都要重复添加 很麻烦 如果大家
  • Spring实现封装自定义注解@Trimmed清除字符串前后的空格

    在Spring中实现字符串清除的方法有很多 原生方法String自带trim 方法 或者使用StringUtils提供的trim 方法 通常可以将上面的方式封装成自定义注解的形式去实现来节省更多的业务代码 Trimmed java impo
  • Foggy_driving数据集下载以及将其转换成VOC数据格式

    Foggy driving数据集官方下载地址 百度网盘下载链接 https pan baidu com s 1q4dhnlX doxlt13Mi uFZQ 提取码 2ap3 VOC格式的Foggy driving数据集百度网盘下载链接 ht
  • html基础题目

    1 在html中 样式表按照应用方式可以分为三种类型 其中不包括 d A 内嵌样式表 B 行内样式表 C 外部样式表文件 D 类样式表 2 在HTML中 可以使用 d 标记向网页中插入GIF动画文件 A
  • 从零开始实现自己的Kalimba——Cocos Creator新手教程系列(一)使用瓦片图Tiledmap设计游戏地图

    瓦片图Tiledmap可能是很多2d游戏开发者的偏爱 本节就Cocos Creator如何使用瓦片图进行详细的讲解 Tiled地图编辑器的下载安装不再赘述 下面介绍如何使用地图编辑器 创建新地图 地图方向选正常 其中45度和等角 交错 适合
  • uview2.0封装http请求实战以及常见请求传参实录

    1 前言 2 使用步骤 2 1 配置请求拦截器以及api集中管理配置 2 2 main js中进行引入请求拦截器 2 3 页面中引入请求方法并使用 1 前言 uview2 0是uniapp开发中使用频率相对来讲比较高的一款框架 今天从实战角
  • python爬虫十二:初步使用Scrapy框架爬取数据

    1 通过pipelines操作拿到的数据 要点一 爬虫文件必须通过关键字yield生成器才能与pipelines建立链接才可以操作 当运行爬虫文件之后执行的顺序如下图简介 如果重写模块或者内部方法可能会造成麻烦 往下翻阅可以看到open s
  • UC测试实习生笔试面试

    笔试 2014年5月14号 中大公教C402 一个半钟 好紧的时间 除了选择题和编程题 其他都感觉不好啊 一 选择题 1 chmod 755 filename 之后 文件权限为 A rwxr xr x 2 403状态表示 3 用于转义的字符
  • Python3网络爬虫--爬取百度搜索结果(附源码)

    文章目录 一 准备工作 1 工具 二 思路 1 爬虫思路 2 数据抽取思路 三 源代码 四 结果 五 总结 今天更新一篇基础 使用Python爬取百度搜索结果 最后将爬取结果保存到txt文本文件中 一 准备工作 1 工具 1 Google
  • java线程安全问题分析、3种解决办法

    目录 一 线程不安全 1 1 代码 1 2 解析 解析 卖出不存在的票 解析 卖出相同的票 1 3 解决办法 二 解决方法1 同步代码块 2 1 代码 2 2 解析 三 解决方法2 同步方法 3 1 代码 3 2 说明 四 解决方法3 Lo
  • php如何实现mac端重签ipa,mac用终端对ipa包重新签名

    一年前写过一个用命令行对安卓的apk包重新签名的文章 网上是让用IResin这个软件 但是我用了总是重签名失败 报错warning resource rules has been deprecated in Mac OSX gt 10 10
  • Qml-------ApplicationWindow

    QML内的窗口元素 ApplicationWindow和window 此文章讲解一下ApplicationWindow的基础使用 导入模块 QtQuick Controls qt两个模块的定义与使用方法 import QtQuick Con
  • std::jthread与std::thread区别

    std jthread是C 20新引入的线程类 与 std thread 类似 或者说 jthread是对thread进一步的封装 功能更强大 std jthread的 j实际上是 joining的缩写 众所周知 std thread在其生
  • 创建线程的第一种方式:继承Thread类(含Thread类部分源码解析)

    创建线程的第一种方式 继承Thread类 定义一个类 继承Thread类 重写Thread类中的run方法 创建Thread类的实现类的对象 利用该对象调用Thread类中的start方法 运行结果 好了 接下来我们看源码 首先我们看一下T
  • gcc命令中参数c和o混合使用的详解

    操作系统 windows xp 软件 msys 编译器 gcc gcc c a c 编译成目标文件a o gcc o a a o 生成执行文件a exe gcc a c 生成执行文件a exe gcc o a c a c 编译成目标文件a
  • qml添加qmldir文件步骤

    1 写自定义控件 2 编写qmldir文件 3 在pro文件中添加模块路径 4 在mian cpp中加载qml之前添加模块路径 5 qml中引用自定义qml模块 6 效果如图 参考 参考 https blog csdn net qq 165
  • 机器学习量化应用:用回归策略预测价格

    我们已经知道 监督学习主要就是分类和回归两种方法 本文以支持向量机 support vector machine SVM 来说明 如何采取机器学习中回归方法来预测股票价格 这在传统量化中是根本不可能实现的 在机器学习领域却能达到50 以上的