随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,能不能通过机器学习来分析股票呢?
本文就抛砖引玉介绍一种使用CatBoost分析股票因子的程序。
提示:以下是本篇文章正文内容,下面案例可供参考
CatBoost是一种基于梯度提升决策树(Gradient Boosting Decision Tree, GBDT)算法的机器学习库,由俄罗斯搜索引擎公司Yandex于2017年开发。CatBoost是一种高性能、开源的机器学习框架,可用于分类、回归和排序等任务。
CatBoost的主要优势和特点包括:
高性能:CatBoost使用了一些特殊的技术,如对称树、随机化、数据采样等,以提高模型的训练速度和预测速度。
自适应特征缩放:CatBoost能够自动识别每个特征的类型,并进行相应的特征缩放,从而提高模型的准确性。
支持类别型特征:CatBoost能够自动处理类别型特征,无需进行独热编码等操作。
鲁棒性:CatBoost具有很强的鲁棒性,能够处理缺失值、异常值等问题。
可解释性:CatBoost能够输出每个特征的重要性,从而帮助用户理解模型的决策过程。
支持GPU加速:CatBoost支持GPU加速,可以大幅提高模型的训练速度。
总之,CatBoost是一种强大的机器学习库,具有高性能、自适应特征缩放、支持类别型特征、鲁棒性、可解释性等优势和特点。
它将通达信,同花顺,文华麦语言等指标公式indicators,最简移植到Python中,核心库单个文件,仅百行代码,实现和转换同花顺通达信所有常见指标,整个包就是一个文件,将其复制到项目目录即可调用,指标可以自行扩展。有些平台不允许安装第三方包,这个就一个文件,复制上去就可以用。而且速度也很快。
下载MyTT文件
访问https://github.com/mpquant/MyTT,下载MyTT文件放到运行Python的目录即可。
计算指标,先得有数据,采集数据可考文章《一文学懂通过Tushare、AKshare、baostock、Ashare、Pytdx获取股票行情数据(含代码)》
https://blog.csdn.net/popboy29/article/details/125815775
建议先安装Anaconda ,因为这里把常用的环境已经安装集成安装好了。
安装成功后,在Anaconda import中使用conda命令进行安装
conda install 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指标、布林上轨与股票的关联度是比较高的,那么我们对此类行情是不是就可以多关注以下这个指标的演进情况。
另外,对因子的分析多种多样,要分析其关联性,我们也可以修改指标参数、添加或删除训练参数,下面简要说明一下:
RSI(CLOSE, N=24)
BOLL(CLOSE,N=20, P=2)
MACD(CLOSE,SHORT=12,LONG=26,M=9)
df['K'],df['D'],df['J'] = KDJ(CLOSE,HIGH,LOW, N=9,M1=3,M2=3)
文章抛砖引玉,欢迎评论区留言一起交流!