通过KNN分类模型预测股票涨跌,然后与基准收益画图对比

news2024/9/25 23:20:13

目录

1 获取数据

 2 特征工程:定义一个用于分类的函数

3 特征工程:生成训练数据

4 根据训练数据对分类模型进行拟合,并给出得分

5 使用训练完成的分类模型进行数据预测

6 定义几个有用的函数

7 生成基准收益和策略收益对比结果


记录一下学习过程,是对学习思路的一个梳理和总结,有利于加深理解。

机器学习和人工智能风起云涌,能否利用这种工具找出海量股票数据中的财富密码,相信是很多朋友非常感兴趣的话题。本文记录了通过KNN分类模型预测股票涨跌,并根据生成的信号进行买卖(称之为策略交易),最后通过画图对比策略收益与基准收益,是非常有意思的一个学习过程。

本文数据来自于聚宽,学习内容来自于《深入浅出python量化交易实战》。

1 获取数据

import pandas as pd
import numpy as np
from jqdata import *
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

# start_date = '2022-01-01'
end_date = '2022-12-31'
# columns=['open','close','high','low']

df = get_price('000012.XSHE', count=252, end_date=end_date, skip_paused=True)

# type(arr_data)
# df = pd.DataFrame(arr_data, columns=columns)

df.head(10)

返回结果:

 

 2 特征工程:定义一个用于分类的函数

生成用于后面进行训练的特征数据。

# 定义一个用于分类的函数,给数据表增加3个字段
def classification_tc(df):
    df['open-close'] = df['open'] - df['close']
    df['high-low'] = df['high'] - df['low']
    # 添加一个target字段,如果次日收盘价高于当日收盘价,标记为1,反之为-1
    df['target'] = np.where(df['close'].shift(-1)>df['close'], 1, -1)
    # 去掉有空值的行
    df = df.dropna()
    # 将open-close和high-low作为数据集的特征
    X = df[['open-close', 'high-low']]
#     X = df[['open-close']]
    # 将target赋值给y
    y = df['target']
    return X,y

3 特征工程:生成训练数据

生成训练数据后,人工验证一下 target 是否正确。这个target是上面函数计算出来的,不是分类模型生成的,因为到现在还没开始训练。

#使用classification_tc函数生成数据集的特征与目标
X,y = classification_tc(df)
# 这里设定一个确定的 random_state 值,这样后面的准确率就不会每次都改变
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, random_state=5)

print('X长度:', len(X))
print('y长度:', len(y))


df.head(10)

 需要注意非常重要的一点,这里要设定一个确定的 random_state 值,这样后面的准确率就不会每次都改变。

4 根据训练数据对分类模型进行拟合,并给出得分

# 创建一个KNN实例,
knn_clf = KNeighborsClassifier(n_neighbors=95)
# 使用KNN拟合训练集
knn_clf.fit(X_train, y_train)
#查看模型在训练集和验证集中的准确率
print('训练集准确率 %.2f'%knn_clf.score(X_train, y_train))
print('验证集准确率 %.2f'%knn_clf.score(X_test, y_test))
训练集准确率 0.58
验证集准确率 0.55

看上去准确率不高。

现在完成分类模型拟合(训练)。

5 使用训练完成的分类模型进行数据预测

预测结果保存在'predict_signal'字段。

# 使用KNN模型预测每日股票的涨跌,保存为Predict_Signal
df['predict_signal'] = knn_clf.predict(X)
# 增加一个收益字段 return 对数收益
df['return'] = np.log(df['close']/df['close'].shift(1))

# df[df['predict_signal']==1]
df.head(10)

 这是预测出来的结果,不明白为什么绝大部分预测结果都是-1。

6 定义几个有用的函数

# 定义一个累计基准收益的函数
def cum_return(df, split_value):
    cum_return = df[split_value:]['return'].cumsum()*100
    return cum_return

# 定义一个使用策略收益的函数
def strategy_return(df, split_value):
    df['strategy_return'] = df['return']*df['predict_signal'].shift(1)
    cum_strategy_return = df[split_value:]['strategy_return'].cumsum()*100
    return cum_strategy_return

# 定义一个绘图函数,对比2种收益
def plot_chart(cum_return, cum_strategy_return, symbol1, symbol2):
    plt.figure(figsize=(16, 8))
    plt.plot(cum_return, '--', label=symbol1)
    plt.plot(cum_strategy_return, label=symbol2)
    plt.legend()
    plt.show()

7 生成基准收益和策略收益对比结果

# !!! 上面运行后,这里接着运行才行,否则这里连续运行2次就出错。不知道哪里的问题
# 首先计算基准收益
cum_return = cum_return(df, split_value=len(X_train))
# 然后计算使用算法交易带来的收益(同样只计算预测集)
cum_strategy_return = strategy_return(df, split_value=len(X_train))
# 利用图像对比
plot_chart(cum_return, cum_strategy_return, '基准收益', '策略收益')

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

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

相关文章

排序算法——快速排序(C语言多种实现及其优化策略)

快速排序总述快速排序递归框架单趟快速排序**hoare法****挖坑法**前后指针法快排改进key的选取**随机选key****三数取中**小区间优化**面对多个重复数据时的乏力**总述 快速排序可以说是排序界的大哥的存在,在c库中的qsort和c库中的sort两个排序底层都是用快速排序…

常用运放电路总结记录

前言 上一篇文章我们复习了一下运放的基本知识,尽量的用简单的描述带大家去理解运算放大器: 带你理解运算放大器 对于运放的使用,存在着一些经典常用的应用电路,这个其实网络上已经有大量的文章做记录总结了,作为电…

【Elastic (ELK) Stack 实战教程】11、使用 ElastAlert 实现 ES 钉钉群日志告警

目录 一、ElastAlert 概述 二、安装 ElastAlert 2.1 安装依赖 2.2 安装 Python 环境 2.3 安装 ElastAlert 2.4 ElastAlert 配置文件 2.5 创建 ElastAlert 索引 2.6 测试告警配置是否正常 三、ElastAlert 集成钉钉 3.1 下载 ElastAlert 钉钉报警插件 3.2 创建钉钉机器…

【硬件外设使用】——can

【硬件外设使用】——can can基本概念can 通讯can使用方法pyb.can can可用的传感器 can基本概念 CAN是Controller Area Network的缩写,即控制器局域网。它是一种多主机串行通信协议,用于连接计算机、传感器、执行器和其他设备。 常用于汽车、工业自动化…

如何在不丢失数据的情况下重装Windows 10?

为什么需要重新安装Windows 10? 随着时间的推移,Windows可能会变慢。这可能是由多种原因引起的,例如您安装了许多额外的启动程序,这些程序会延长启动过程等。如果您的Windows系统速度变慢并且无论您卸载多少程序都没有加速&…

CodeGeeX论文发表:揭秘AI辅助编程工具背后的大模型

近日,CodeGeeX模型迭代v1.5版本上线,用户反馈模型效果和使用效率较之前有大幅提升。 恰逢CodeGeeX团队在arxiv上发布了论文,详细介绍了CodeGeeX AI编程辅助工具背后的代码生成大模型的架构、训练过程及推理加速等工作。 今天我们对这篇论文的…

【从零开始学Skynet】实战篇《球球大作战》(三):封装常用的API

为什么要封装?封装可以减少一些重复代码,提高我们的工作效率。 1、定义属性 新建文件lualib/service.lua,定义模块的属性, service模块是对Skynet服务的一种封装,代码如下所示: local skynet require &qu…

Linux 下编译 thrift

thrift编译需要依赖 openssl,首先按照文章《Openssl在Linux下编译/交叉编译》编译openssl。 网上有文章说thrift编译还需要依赖Boost,libevent,但是我发现不依赖这两个库也能把thrift编译出来。在 https://github.com/apache/thrift/releases…

R -- 二分类问题的分类+预测

brief 分类大致分为有监督分类和无监督分类,这里学习有监督分类。有监督分类一般包括逻辑回归、决策树、随机森林、支持向量机、神经网络等。 有监督学习基于一组包含预测变量值和输出变量值的样本单元。然后可以将全部数据分为一个训练数据集和一个验证数据集&…

【好刊推荐】知名出版社影响因子7+被踢出SCI,投稿前如何选期刊?

今年3月Hindawi旗下的19本期刊被SCIE剔除,其中有一本影响因子7,以下从期刊各个指标方面分析一下具体原因: 期刊剔除:影响因子7 期刊简介 期刊名称: OXIDATIVE MEDICINE AND CELLULAR LONGEVITY ISSN / eISSN&#…

Stacking算法预测银行客户流失率

Stacking算法预测银行客户流失率 描述 为了防止银行的客户流失,通过数据分析,识别并可视化哪些因素导致了客户流失,并通过建立一个预测模型,识别客户是否会流失,流失的概率有多大。以便银行的客户服务部门更加有针对…

Android桌面长按图标快捷方式——Shortcuts

简介 当我们在长按Android应用的桌面图标时,一般回弹出一个列表,上面一般有应用信息、卸载应用等功能,并且部分应用在这里还添加了自己的快捷方式,今天主要介绍如何添加自定义的快捷方式。 长按桌面显示的快捷方式在Android中叫…

中小企业面临怎样的数字化转型局面

当前,我国经济长期向好的基本面没有改变,但承受着“需求收缩、供给冲击、预期减弱”的三重压力,中小企业的数字化转型之路较之以往更加艰难、曲折。为帮助中小企业纾困解难、平稳渡过危机,需进一步优化政策“组合拳”,…

单片机中常用的轻量级校验算法

UART有一个奇偶校验,CAN通信有CRC校验。Modbus、MAVlink、USB等通信协议也有校验信息。 在自定义数据存储时,有经验的工程师都会添加一定校验信息。 你平时通信,或者数据存储时,你有用到校验信息吗?下面就介绍几种常见…

Java面试题总结 | Java面试题总结3-JVM模块(持续更新)

JVM 文章目录JVMJVM的内存组成模型java的内存模型定义了什么java的内存分布情况程序计数器是什么?堆、栈、方法区都存放的是什么堆和栈的区别类加载JMM主内存和本地内存交互操作volatile如何保证可见性volatile如何保证有序性happen-before了解过吗?内存…

【JS】BOM 详解(工作必备)

文章目录BOM一、History (浏览器记录)1.1、history.go(指定页)1.2、history.back(上一页)1.3、history.forword(下一页)二、Location(浏览器地址)2.1、操作属…

基于OpenCV的图片和视频人脸识别

目录 🥩前言 🍖环境使用 🍖模块使用 🍖模块介绍 🍖模块安装问题: 🥩人脸检测 🍖Haar 级联的概念 🍖获取 Haar 级联数据 🍗 1.下载所需版本 🍗 2.安…

前后端不分离项目如何使用elementUI

首先,去官网下载element 的js和css和字体等文件 其次,分别将js和css 引入到项目 然后就可以使用了,使用方法和vue中使用element方法一致、

5款最新最实用的小软件,让你的工作和生活更轻松

我喜欢发现和分享一些好用的软件,我觉得它们可以让我们的工作和生活更加轻松和快乐。今天给大家介绍五款我最近发现的软件, GIF录制工具——Screen To Gif Screen To Gif是一款完全免费的GIF录制神器,可以让你轻松地录制屏幕、摄像头或画板…

学生信息管理案例

效果图: 业务模块: 点击录入按钮可以录入数据点击删除可以删除当前的数据 注意:本次案例,我们尽量减少dom操作,采用操作数据的形式。增加和删除都是针对数组的操作,然后根据数组数据渲染页面 核心思路:…