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


前言

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

本文就抛砖引玉介绍一种使用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

运行后结果如下:

(base) C:\Users\Administrator>conda install catboost
Retrieving notices: ...working... done
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: d:\ProgramData\anaconda3

  added / updated specs:
    - catboost


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    boltons-23.0.0             |  py310haa95532_0         425 KB
    boost-cpp-1.73.0           |      h2bbff1b_12          16 KB
    cairo-1.16.0               |       haedb8bc_4         1.9 MB
    catboost-1.0.6             |  py310haa95532_1        30.6 MB
    conda-23.3.1               |  py310haa95532_0         983 KB
    expat-2.4.9                |       h6c2663c_0         207 KB
    font-ttf-dejavu-sans-mono-2.37|       hd3eb1b0_0         335 KB
    font-ttf-inconsolata-2.001 |       hcb22688_0          83 KB
    font-ttf-source-code-pro-2.030|       hd3eb1b0_0         654 KB
    font-ttf-ubuntu-0.83       |       h8b1ccd4_0         1.5 MB
    fontconfig-2.14.1          |       hc0defaf_1         198 KB
    fonts-anaconda-1           |       h8fa9717_0           3 KB
    fonts-conda-ecosystem-1    |       hd3eb1b0_0           5 KB
    fribidi-1.0.10             |       h62dcd97_0          63 KB
    getopt-win32-0.1           |       h2bbff1b_0          19 KB
    graphite2-1.3.14           |       hd77b12b_1          91 KB
    graphviz-2.50.0            |       h7eca76f_1        1007 KB
    gts-0.7.6                  |       h63ab5a1_3         181 KB
    harfbuzz-4.3.0             |       hb646838_1         855 KB
    jsonpatch-1.32             |     pyhd3eb1b0_0          15 KB
    jsonpointer-2.1            |     pyhd3eb1b0_0           9 KB
    libboost-1.73.0            |      h6c2663c_12        20.1 MB
    libgd-2.3.3                |       hd77b12b_2         350 KB
    pango-1.50.7               |       h78c2152_0         279 KB
    pixman-0.40.0              |       h2bbff1b_1         402 KB
    poppler-22.12.0            |       h268424c_0         2.4 MB
    poppler-data-0.4.11        |       haa95532_1         432 KB
    python-graphviz-0.20.1     |  py310haa95532_0          64 KB
    ------------------------------------------------------------
                                           Total:        63.1 MB

The following NEW packages will be INSTALLED:

  boltons            pkgs/main/win-64::boltons-23.0.0-py310haa95532_0
  boost-cpp          pkgs/main/win-64::boost-cpp-1.73.0-h2bbff1b_12
  cairo              pkgs/main/win-64::cairo-1.16.0-haedb8bc_4
  catboost           pkgs/main/win-64::catboost-1.0.6-py310haa95532_1
  expat              pkgs/main/win-64::expat-2.4.9-h6c2663c_0
  font-ttf-dejavu-s~ pkgs/main/noarch::font-ttf-dejavu-sans-mono-2.37-hd3eb1b0_0
  font-ttf-inconsol~ pkgs/main/noarch::font-ttf-inconsolata-2.001-hcb22688_0
  font-ttf-source-c~ pkgs/main/noarch::font-ttf-source-code-pro-2.030-hd3eb1b0_0
  font-ttf-ubuntu    pkgs/main/noarch::font-ttf-ubuntu-0.83-h8b1ccd4_0
  fontconfig         pkgs/main/win-64::fontconfig-2.14.1-hc0defaf_1
  fonts-anaconda     pkgs/main/noarch::fonts-anaconda-1-h8fa9717_0
  fonts-conda-ecosy~ pkgs/main/noarch::fonts-conda-ecosystem-1-hd3eb1b0_0
  fribidi            pkgs/main/win-64::fribidi-1.0.10-h62dcd97_0
  getopt-win32       pkgs/main/win-64::getopt-win32-0.1-h2bbff1b_0
  graphite2          pkgs/main/win-64::graphite2-1.3.14-hd77b12b_1
  graphviz           pkgs/main/win-64::graphviz-2.50.0-h7eca76f_1
  gts                pkgs/main/win-64::gts-0.7.6-h63ab5a1_3
  harfbuzz           pkgs/main/win-64::harfbuzz-4.3.0-hb646838_1
  jsonpatch          pkgs/main/noarch::jsonpatch-1.32-pyhd3eb1b0_0
  jsonpointer        pkgs/main/noarch::jsonpointer-2.1-pyhd3eb1b0_0
  libboost           pkgs/main/win-64::libboost-1.73.0-h6c2663c_12
  libgd              pkgs/main/win-64::libgd-2.3.3-hd77b12b_2
  pango              pkgs/main/win-64::pango-1.50.7-h78c2152_0
  pixman             pkgs/main/win-64::pixman-0.40.0-h2bbff1b_1
  poppler            pkgs/main/win-64::poppler-22.12.0-h268424c_0
  poppler-data       pkgs/main/win-64::poppler-data-0.4.11-haa95532_1
  python-graphviz    pkgs/main/win-64::python-graphviz-0.20.1-py310haa95532_0

The following packages will be UPDATED:

  conda                              23.1.0-py310haa95532_0 --> 23.3.1-py310haa95532_0


Proceed ([y]/n)? y

done

(base) C:\Users\Administrator>

三. 使用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. 剔除训练参数,只需要在“不参与训练、验证和展示的字段”的列表里删除相应字段即可。

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

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT里的交易员

分享是一种快乐,打赏是一种肯定

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值