【机器学习】使用CatBoost库分析股票行情(指标为RSI、Boll、MACD和MA)并输出因子占比分析

文章目录

  • 前言
  • 一、CatBoost是什么?
  • 二、准备工作
      • 2.1 MyTT
      • 2.2 获取日K数据
      • 2.3 安装CatBoost
  • 三. 使用CatBoost库分析股票行情(完整源码)
  • 总结


前言

随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,能不能通过机器学习来分析股票呢?

本文就抛砖引玉介绍一种使用CatBoost分析股票因子的程序。


提示:以下是本篇文章正文内容,下面案例可供参考

一、CatBoost是什么?

CatBoost是一种基于梯度提升决策树(Gradient Boosting Decision Tree, GBDT)算法的机器学习库,由俄罗斯搜索引擎公司Yandex于2017年开发。CatBoost是一种高性能、开源的机器学习框架,可用于分类、回归和排序等任务。

CatBoost的主要优势和特点包括:

  1. 高性能:CatBoost使用了一些特殊的技术,如对称树、随机化、数据采样等,以提高模型的训练速度和预测速度。

  2. 自适应特征缩放:CatBoost能够自动识别每个特征的类型,并进行相应的特征缩放,从而提高模型的准确性。

  3. 支持类别型特征:CatBoost能够自动处理类别型特征,无需进行独热编码等操作。

  4. 鲁棒性:CatBoost具有很强的鲁棒性,能够处理缺失值、异常值等问题。

  5. 可解释性:CatBoost能够输出每个特征的重要性,从而帮助用户理解模型的决策过程。

  6. 支持GPU加速:CatBoost支持GPU加速,可以大幅提高模型的训练速度。

总之,CatBoost是一种强大的机器学习库,具有高性能、自适应特征缩放、支持类别型特征、鲁棒性、可解释性等优势和特点。

二、准备工作

2.1 MyTT

它将通达信,同花顺,文华麦语言等指标公式indicators,最简移植到Python中,核心库单个文件,仅百行代码,实现和转换同花顺通达信所有常见指标,整个包就是一个文件,将其复制到项目目录即可调用,指标可以自行扩展。有些平台不允许安装第三方包,这个就一个文件,复制上去就可以用。而且速度也很快。

下载MyTT文件
访问https://github.com/mpquant/MyTT,下载MyTT文件放到运行Python的目录即可。

2.2 获取日K数据

计算指标,先得有数据,采集数据可考文章《一文学懂通过Tushare、AKshare、baostock、Ashare、Pytdx获取股票行情数据(含代码)》
https://blog.csdn.net/popboy29/article/details/125815775

2.3 安装CatBoost

建议先安装Anaconda ,因为这里把常用的环境已经安装集成安装好了。
安装成功后,在Anaconda import中使用conda命令进行安装
conda install catboost

三. 使用CatBoost库分析股票行情(完整源码)

# -*- coding: utf-8 -*-
# 以下是使用CatBoost库分析股票行情的Python源码,指标为RSI、Boll、 MACD和MA,并输出因子占比分析的代码:

import pandas as pd
import numpy as np
from catboost import CatBoostRegressor, Pool
from Ashare import *
from MyTT import *

# 获取股票行情数据
# df = pd.read_csv('stock_data.csv')
df = get_price('sh600258',frequency='1d',count=1000)
df['trade_date'] = df.index
print(df.tail(3))

# 计算指标
CLOSE = df['close']
df['RSI'] = RSI(CLOSE)
df['UPPER'], df['MID'], df['LOWER']  = BOLL(CLOSE)
df['DIFF'], df['DEA'], df['MACD'] = MACD(CLOSE,SHORT=12,LONG=26,M=9)
df['MA10'] = MA(CLOSE,10)
df['MA20'] = MA(CLOSE,20)
df['MA60'] = MA(CLOSE,60)

# 删除缺失值
df.dropna(inplace=True)

# 拆分训练集和测试集
train_size = int(len(df) * 0.8)
train_data = df[:train_size]
test_data = df[train_size:]

# 不参与训练、验证和展示的字段
no_train =['trade_date', 'close', 'open', 'high', 'low']

# 定义训练集和测试集
train_pool = Pool(train_data.drop(no_train, axis=1), train_data['close'])
test_pool = Pool(test_data.drop(no_train, axis=1), test_data['close'])

# 定义CatBoost回归器
model = CatBoostRegressor(iterations=1000, learning_rate=0.05, depth=6, loss_function='RMSE')

# 训练模型
model.fit(train_pool)

# 输出因子占比分析
feature_importances = model.get_feature_importance()
feature_names = train_data.drop(no_train, axis=1).columns
sorted_idx = feature_importances.argsort()

for i in sorted_idx:
    print(f"{feature_names[i]}: {feature_importances[i]:.3f}")

# 预测测试集
predictions = model.predict(test_pool)

# 计算误差
mse = np.mean((predictions - test_data['close']) ** 2)
print('均方误差MSE:', mse)

以上代码会输出每个因子的占比分析结果。请注意,这只是一个简单的示例代码,您需要根据您的数据和需求进行修改和调整。

经测试,结果如下:

volume: 0.907
DEA: 2.172
DIFF: 3.081
LOWER: 5.415
MACD: 5.446
MID: 8.423
MA60: 9.331
MA20: 9.746
UPPER: 17.216
RSI: 17.310
MA10: 20.953
均方误差MSE: 0.08222467686549087


总结

经过上面的分析,我们看到均方误差(MSE,结果越小越好)还是挺大的,但10日均线、RSI指标、布林上轨与股票的关联度是比较高的,那么我们对此类行情是不是就可以多关注以下这个指标的演进情况。

另外,对因子的分析多种多样,要分析其关联性,我们也可以修改指标参数、添加或删除训练参数,下面简要说明一下:

  1. 文中使用的指标都是默认参数,且均改为国内指标。如:
RSI(CLOSE, N=24)
BOLL(CLOSE,N=20, P=2)
MACD(CLOSE,SHORT=12,LONG=26,M=9)
  1. 增加其它指标和参数,例如:增加KDJ指标,只需要在“指标计算”环节增加如下代码:
df['K'],df['D'],df['J'] = KDJ(CLOSE,HIGH,LOW, N=9,M1=3,M2=3)
  1. 剔除训练参数,只需要在“不参与训练、验证和展示的字段”的列表里删除相应字段即可。

文章抛砖引玉,欢迎评论区留言一起交流!

你可能感兴趣的:(Python经验池,量化交易,机器学习,python,人工智能)