tushare单个股票过去五年的数据整理与预测

news2025/5/26 12:56:49

文章目录

  • 前言:
    • 1. 导入相关包
    • 2. 数据预处理
    • 3. 构建模型
    • 3. 模型训练
    • 4. 检查数据
    • 6. 工作中其他常用包记录

前言:

%md
在量化投资中,计算收益率是更常见的做法,而不是仅计算股价。计算收益率可以更好地反映投资的回报情况,无论是单个股票、投资组合还是策略的绩效评估都会使用收益率作为重要的指标。

收益率是指投资在一定时间内所产生的盈利或损失的百分比。通过计算收益率,投资者可以比较不同资产或策略的表现,判断其相对优劣。

对于股票投资,收益率可以根据股票价格的变动计算得出。常见的收益率计算方法包括简单收益率、对数收益率等。

简单收益率(简单回报率)可以通过以下公式计算:

简单收益率 = (期末价格 - 起始价格) / 起始价格

对数收益率(对数回报率)可以通过以下公式计算:

对数收益率 = ln(期末价格 / 起始价格)

通过计算收益率,投资者可以评估投资的盈利能力、风险水平以及相对于市场或基准的超额收益。这有助于制定投资策略、进行风险管理和决策制定。

需要注意的是,股价仅仅是股票在某一时点的价格,而收益率则提供了更全面的信息,考虑了价格的变化和时间因素,能够更好地反映投资的效果和绩效。因此,在量化投资中,计算收益率是更常见和有意义的做法。

1. 导入相关包

# 导入所需库和模块:
from tscv import gap_train_test_split
from catboost import CatBoostRegressor

import torch
import torch.nn as nn
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

import warnings
import tushare as ts
warnings.filterwarnings('ignore')
from torch.optim import Adam, SGD
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.model_selection import GridSearchCV, TimeSeriesSplit, ParameterGrid
from torch.utils.data import DataLoader, TensorDataset
from sklearn.metrics import mean_squared_error, r2_score, make_scorer


from tensorflow.keras.models import Sequential, Model, load_model
from tensorflow.keras.layers import Dense, Dropout, LSTM
from keras.wrappers.scikit_learn import KerasRegressor
from keras import backend
!pip install chinese_calendar
from chinese_calendar import is_holiday



'''
!pip install scikit-learn
!pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/cu111/torch_stable.html

'''

start_date = '20040101'
end_date = '20230421'
# 初始化pro接口
pro = ts.pro_api('mycode')
# Get daily trading data for stocks
train_df = pro.daily(ts_code='000001.SZ', start_date=start_date, end_date=end_date)


# Get PE ratio data for stocks
pe_data = pro.query('daily_basic', ts_code='000001.SZ', start_date=start_date, end_date=end_date, fields='ts_code,trade_date,pe')

# Get turnover rate data for stocks
turnover_data = pro.query('daily_basic', ts_code='000001.SZ', start_date=start_date, end_date=end_date, fields='ts_code,trade_date,turnover_rate')



# Merge PE ratio data into train_df
train_df = pd.merge(train_df, pe_data, on=['ts_code', 'trade_date'], how='left')

# Merge turnover rate data into train_df
train_df = pd.merge(train_df, turnover_data, on=['ts_code', 'trade_date'], how='left')

display(train_df)

#####################################################################################
start_date = pd.to_datetime(start_date)
end_date = pd.to_datetime(end_date)
dates = pd.date_range(start=start_date, end=end_date, freq='D')
A = pd.DataFrame({'Date': dates})

B_data = train_df

B_columns = ['ts_code', 'trade_date', 'open', 'high', 'low', 'close', 'pre_close', 'change', 'pct_chg', 'vol', 'amount', 'pe', 'turnover_rate']

B = pd.DataFrame(B_data, columns=B_columns)
B['trade_date'] = pd.to_datetime(B['trade_date'], format='%Y%m%d')

merged = A.merge(B, how='left', left_on='Date', right_on='trade_date')


merged_with_holidays = merged 
# from chinese_calendar import is_holiday

# 添加节假日名称列到合并后的表格
merged_with_holidays['HolidayName'] = merged_with_holidays['Date'].apply(lambda x: is_holiday(x))

# 将节假日名称的布尔值转换为相应的字符串
# merged_with_holidays['HolidayName'] = merged_with_holidays['HolidayName'].map({True: '节假日', False: '非节假日'})
# merged_with_holidays['HolidayName'] = merged_with_holidays['HolidayName'].map({True: 1, False: 0})


merged_with_holidays['Year'] = pd.to_datetime(merged_with_holidays['Date']).dt.year
merged_with_holidays['Month'] = pd.to_datetime(merged_with_holidays['Date']).dt.month
merged_with_holidays['Day'] = pd.to_datetime(merged_with_holidays['Date']).dt.day


original_data = merged_with_holidays[['Date', 'Year', 'Month', 'Day', 'open', 'high', 'low', 'close',
       'pre_close', 'change', 'pct_chg', 'vol', 'amount', 'pe',
       'turnover_rate', 'HolidayName']].copy()

2. 数据预处理

for year_num in original_data['Year'].unique():
    # Add previous years' data
    for i in range(1, 6):
        year = year_num - i
        print(year)
#         lenyear = len(original_data[original_data['Year'] == year])
        prefix = f'ya{i:02}'
        print(prefix)
        print('\n')


#         lenya01 = len(original_data['Year']==year)
#         lenya02 = len(original_data['Year']==year-1)
#         lenya03 = len(original_data['Year']==year-2)
#         lenya04 = len(original_data['Year']==year-3)
#         lenya05 = len(original_data['Year']==year-4)
        prefix = f'ya{i:02}'

        if   i==1:
#             lenyear = lenya01
            lenyear = len(original_data[original_data['Year'] == year])

        elif i==2:
#             lenyear = lenya01 + lenya02
            lenyear = len(original_data[original_data['Year'] == year-1] )+ len(original_data[original_data['Year'] == year])

        elif i==3:
#             lenyear = lenya01 + lenya02 + lenya03
            lenyear = len(original_data[original_data['Year'] == year-2]) + len(original_data[original_data['Year'] == year-1]) + len(original_data[original_data['Year'] == year])

        elif i==4:
#             lenyear = lenya01 + lenya02 + lenya03 + lenya04
            lenyear = len(original_data[original_data['Year'] == year-3]) + len(original_data[original_data['Year'] == year-2]) + len(original_data[original_data['Year'] == year-1]) + len(original_data[original_data['Year'] == year])

        elif i==5:
#             lenyear = lenya01 + lenya02 + lenya03 + lenya04 + lenya05
            lenyear = len(original_data[original_data['Year'] == year-4]) + len(original_data[original_data['Year'] == year-3]) + len(original_data[original_data['Year'] == year-2]) + len(original_data[original_data['Year'] == year-1]) + len(original_data[original_data['Year'] == year])
        print(lenyear)


        original_data[prefix + '_open'] = original_data['open'].shift(lenyear)
        original_data[prefix + '_high'] = original_data['high'].shift(lenyear)
        original_data[prefix + '_low'] = original_data['low'].shift(lenyear)
        original_data[prefix + '_close'] = original_data['close'].shift(lenyear)
        original_data[prefix + '_pre_close'] = original_data['pre_close'].shift(lenyear)
        original_data[prefix + '_change'] = original_data['change'].shift(lenyear)
        original_data[prefix + '_pct_chg'] = original_data['pct_chg'].shift(lenyear)
        original_data[prefix + '_vol'] = original_data['vol'].shift(lenyear)
        original_data[prefix + '_amount'] = original_data['amount'].shift(lenyear)
        original_data[prefix + '_pe'] = original_data['pe'].shift(lenyear)
        original_data[prefix + '_turnover_rate'] = original_data['turnover_rate'].shift(lenyear)
        original_data[prefix + '_HolidayName'] = original_data['HolidayName'].shift(lenyear)

3. 构建模型

# 将数据按照28比分成观测数据和验证数据,其中观测数据分成训练集和测试集
split_size=round(len(original_data)*0.20) # 验证集
mergeed_pandas_df = original_data[:-split_size].copy()
mergeed_pandas_df = mergeed_pandas_df.fillna( method='pad', axis=0)
mergeed_pandas_df = mergeed_pandas_df[mergeed_pandas_df['Year'] >=2010]
# 测试数据集
# test_split = round(split_size*0.20)
test_split = 60

X = mergeed_pandas_df[[ 'Year', 'Month', 'Day',
# 注释部分的变量都是未知的
#                         'open', 'high', 'low', 
#        'pre_close', 'change', 'pct_chg', 'vol', 'amount', 'pe',
#        'turnover_rate', 
                       'HolidayName','ya01_open', 'ya01_high', 'ya01_low',
       'ya01_close', 'ya01_pre_close', 'ya01_change', 'ya01_pct_chg',
       'ya01_vol', 'ya01_amount', 'ya01_pe', 'ya01_turnover_rate',
       'ya01_HolidayName', 'ya02_open', 'ya02_high', 'ya02_low', 'ya02_close',
       'ya02_pre_close', 'ya02_change', 'ya02_pct_chg', 'ya02_vol',
       'ya02_amount', 'ya02_pe', 'ya02_turnover_rate', 'ya02_HolidayName',
       'ya03_open', 'ya03_high', 'ya03_low', 'ya03_close', 'ya03_pre_close',
       'ya03_change', 'ya03_pct_chg', 'ya03_vol', 'ya03_amount', 'ya03_pe',
       'ya03_turnover_rate', 'ya03_HolidayName', 'ya04_open', 'ya04_high',
       'ya04_low', 'ya04_close', 'ya04_pre_close', 'ya04_change',
       'ya04_pct_chg', 'ya04_vol', 'ya04_amount', 'ya04_pe',
       'ya04_turnover_rate', 'ya04_HolidayName', 'ya05_open', 'ya05_high',
       'ya05_low', 'ya05_close', 'ya05_pre_close', 'ya05_change',
       'ya05_pct_chg', 'ya05_vol', 'ya05_amount', 'ya05_pe',
       'ya05_turnover_rate', 'ya05_HolidayName']][:-test_split]

y = mergeed_pandas_df['close'][:-test_split]

# 观测数据集
X_train, X_test, y_train, y_test = gap_train_test_split( X,  y, test_size=2, gap_size=25 )
cat_features = ['Year', 'Month', 'Day','HolidayName' , 'ya01_HolidayName','ya03_HolidayName','ya04_HolidayName', 'ya05_HolidayName' ]

X_verification = mergeed_pandas_df[[ 'Year', 'Month', 'Day',
# 注释部分的变量都是未知的
#                         'open', 'high', 'low', 
#        'pre_close', 'change', 'pct_chg', 'vol', 'amount', 'pe',
#        'turnover_rate', 
                       'HolidayName','ya01_open', 'ya01_high', 'ya01_low',
       'ya01_close', 'ya01_pre_close', 'ya01_change', 'ya01_pct_chg',
       'ya01_vol', 'ya01_amount', 'ya01_pe', 'ya01_turnover_rate',
       'ya01_HolidayName', 'ya02_open', 'ya02_high', 'ya02_low', 'ya02_close',
       'ya02_pre_close', 'ya02_change', 'ya02_pct_chg', 'ya02_vol',
       'ya02_amount', 'ya02_pe', 'ya02_turnover_rate', 'ya02_HolidayName',
       'ya03_open', 'ya03_high', 'ya03_low', 'ya03_close', 'ya03_pre_close',
       'ya03_change', 'ya03_pct_chg', 'ya03_vol', 'ya03_amount', 'ya03_pe',
       'ya03_turnover_rate', 'ya03_HolidayName', 'ya04_open', 'ya04_high',
       'ya04_low', 'ya04_close', 'ya04_pre_close', 'ya04_change',
       'ya04_pct_chg', 'ya04_vol', 'ya04_amount', 'ya04_pe',
       'ya04_turnover_rate', 'ya04_HolidayName', 'ya05_open', 'ya05_high',
       'ya05_low', 'ya05_close', 'ya05_pre_close', 'ya05_change',
       'ya05_pct_chg', 'ya05_vol', 'ya05_amount', 'ya05_pe',
       'ya05_turnover_rate', 'ya05_HolidayName']][-test_split:]

y_verification = mergeed_pandas_df['close'][-test_split:]

3. 模型训练

cat_model_01 =  CatBoostRegressor(iterations=20000, learning_rate=0.03,
        depth=6, l2_leaf_reg=3,
        loss_function='MAE',
        eval_metric='MAE',
        random_seed=23)

cat_model_01 = cat_model_01.fit(X_train, y_train, cat_features=cat_features)

cat_model_01.score(X_test,y_test)


# 参考文献:https://blog.csdn.net/weixin_42305672/article/details/111252715

#######################################################
# 查看验证集数据
y_verification_pred = cat_model_01.predict(X_verification )
mse = mean_squared_error(y_verification, y_verification_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_verification, y_verification_pred)
print('Validation set:\n')
print("MSE:", mse)
print("RMSE:", rmse)
print("R2 score:", r2)
print('Model score:', cat_model_01.score(X_verification, y_verification))

4. 检查数据

#############################################################################################
# 画图查看验证集
X_verification_copy = X_verification.copy()
X_verification_copy['Date'] = X_verification_copy['Year'].astype('str') + X_verification_copy['Month'].astype('str') + X_verification_copy['Day'].astype('str')


X_verification_copy['y_true'] = y_verification
X_verification_copy['y_pred'] = y_verification_pred

tmp_verification = X_verification_copy


x_xticks = tmp_verification['Date']
y_true = tmp_verification['y_true']
y_pred = tmp_verification['y_pred']


mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_true, y_pred)


use_model = cat_model_01
plt.figure(figsize=(30, 10))
# plt.title( title_name + ' ' + 'Week search'+ ' ' + model_name, fontsize=22)
plt.plot(x_xticks, y_true,color="r",label="y_true", ) 
#     plt.plot(x_xticks, y_pred,color=(0,0,0),label="y_pred",)
plt.plot(x_xticks, y_pred,color='g',label="y_pred",)

# plt.tick_params(labelsize=20, rotation=90)
plt.tick_params(labelsize=20, rotation=90)

plt.legend()#增加图例
plt.show() #显示图片

验证集的真实值和预测值

6. 工作中其他常用包记录

from pyspark.sql.window import Window
from pyspark.sql.functions import stddev, avg, pandas_udf, PandasUDFType, expr, array_contains, collect_set, substring, countDistinct, year, month, sum, lag, explode, lit, ceil,posexplode, quarter, first, asc, array, array_intersect, array_distinct, array_except, coalesce, lead
from pyspark.sql.functions import regexp_replace, lower, lit, col, udf, split,  when, count, struct, max, collect_list, weekofyear, lpad, date_format, to_date, weekofyear, desc
from pyspark.sql.types import StringType,ArrayType, IntegerType, DoubleType, StructType, StructField, TimestampType
from pyspark.ml import Pipeline
from pyspark.ml.linalg import VectorUDT, Vectors, SparseVector, DenseVector
from pyspark.ml.evaluation import RegressionEvaluator, ClusteringEvaluator
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder, TrainValidationSplit
from pyspark.ml.regression import RandomForestRegressor , RandomForestRegressionModel, LinearRegression, GBTRegressor, GBTRegressionModel
from pyspark.ml.clustering import KMeans
from pyspark.ml.feature import Tokenizer, StopWordsRemover, Word2Vec, VectorAssembler, Word2VecModel, StringIndexer, OneHotEncoder, VectorIndexer

from sklearn.metrics import mean_squared_error, r2_score
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import GridSearchCV, KFold, TimeSeriesSplit
from tscv import gap_train_test_split
from sklearn.svm import SVR


from datetime import datetime
from numpy import dot
from numpy.linalg import norm
from operator import and_
from functools import reduce
from jellyfish import jaro_winkler_similarity
# from xgboost import XGBRegressor
# from catboost import CatBoostRegressor
from lightgbm import LGBMRegressor

import csv
import os
import re
import math
import jieba
import joblib
import random
import warnings
import numpy as np
import networkx as nx
import pyspark.pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker


warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False



'''

import joblib
joblib.dump('test','/tmp/t.txt')
joblib.dump('testtest','/tmp/t.txt')
'''

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

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

相关文章

Pinctrl子系统_01_Pinctrl子系统介绍

本节介绍在Pinctrl子系统中,将会学习哪些内容。 Pinctrl作用 Pinctrl:Pin Controller,顾名思义,就是用来控制引脚的。 一个芯片有成百上千个引脚,这些引用要怎么配置,配置成什么功能,都是通P…

python+django网上书籍商城小说在线阅读分享下载系统k19is-vue

为了解决用户便捷地在网上购物以及下载文件,本文设计和开发了一个网页小说阅读系统。本系统是基于 B/S架构设计,Dango框架 ,Python技术的前台页面设计与实现,使用Mysql数据库管理来完成系统的相关功能。主要实现了管理员与用户的注…

ETSI TS-关于SCP80

描述 GPC_UICC Configuration_v2.0.pdf 中: 规范 ts_102.225v12.1.0 Secured packet structure for UICC based applications.pdf spi kic kid编码 7 TCP/IP 的实现 在发送安全数据包之前,发送实体应使用定义的推送机制打开 TCP/IP 连接 在 ETSI TS 102 226 [9] …

【MATLAB第34期】基于MATLAB的2023年棕熊优化算法BOA优化LSTM时间序列预测模型 优势明显,注释详细,绘图丰富

【MATLAB第34期】基于MATLAB的2023年棕熊优化算法BOA优化LSTM时间序列预测模型 优势明显,注释详细,绘图丰富,适合小白 一、代码优势 1.使用2023年棕熊算法BOA优化LSTM超参数(学习率,隐藏层节点,正则化系数…

chatgpt赋能Python-python_numpy倒序

Python Numpy倒序:简介、使用和优势 简介 Python是一门功能强大的编程语言,提供了众多开源库,其中Numpy是其中最流行的之一。Numpy是Python中的一个数值计算库,提供了一个高效的数组对象和相应的数学函数。它是数据科学家和机器…

Thonny-适合初学者小白的开箱即用的轻量级 Python IDE

如果你是一位Python初学者小白,那最适合Thonny它了,如果不是初学者,请选择PyDev和Pycharm。 Thonny是一款面向初学者小白的轻量级 IDE,可以让初学者更好更快的入门上手 Python,而不致于在环境上浪费过多的时间。 取之 Python&…

chatgpt赋能Python-python_purple

Python Purple: 一个高效的Python IDE Python Purple是Python程序员们最需要的工具之一。它是一款高效的Python IDE,允许用户轻松地创建,编辑和协作开发Python代码。本文将涉及Python Purple的一些重要特点以及它如何提高编码质量和提高生产力。 介绍P…

【利用AI让知识体系化】TypeScript目标:扩展JavaScript能力

I. TypeScript 简介 TypeScript 的起源 TypeScript 的起源是由微软公司开发,其首席架构师是 Anders Hejlsberg。Anders 是 Delphi 和 C# 语言的创始人,于2012年从微软发布了 TypeScript。 TypeScript 诞生的原因是为了解决 JavaScript 的一些缺点&…

Nginx(四)

部署LNMP架构动态网站WordPress LNMPLinuxNginxMySQLPhp 环境 192.168.29.141centos8Nginx1.24.0192.168.29.142centos8MySQL8.0.33192.168.29.143centos8Php7.2.24 关闭firewalld systemctl stop firewalld systemctl disable firewalld 关闭selinux setenforce 0 sed -ir…

网络原理(六):http 协议(上)

目录 HTTP 协议是什么 抓包工具 Fiddler 的下载 使用Fiddler HTTP 请求 (Request) HTTP 请求格式 首行 请求头(Header) Cookie HTTP 协议是什么 还是老样子,在讲解http 之前我们先来了解以下什么叫做 http 。 HTTP(Hyp…

使用百度 PaddleOCR对身份证识别的简单处理

一:引言 本文才用百度的PaddleOCR对身份证进行识别的处理,由于直接使用并未进行对跟多数据集进行训练,当前的效果是对非少数民族的身份证识别率可以达到85%以上,同时要求身份证图片是正面且相对清晰。否则效果不理想,本…

基于java的时间管理系统的设计与实现

背景 要设计一个时间管理系统,通过这个系统能够满足时间管理的管理功能。系统的主要功能包括首页,个人中心,系统公告管理,用户管理,时间分类管理,事件数据管理,目标数据管理,用户日…

【系统软件】源码编译安装ZLIB——Could NOT find ZLIB(missing:ZLIB_LIBRARY ZLIB_INCLUDE_DIR

【系统软件】源码编译安装ZLIB——Could NOT find ZLIB(missing:ZLIB_LIBRARY ZLIB_INCLUDE_DIR 前言一、简介二、源码下载三、解压、构建四、编译五、安装六、安装成功后如下图七、如何使用zlib中的include 前言 今天原本打算源码编译安装protobuf,但是在构建项目…

图神经网络GNN GCN AlphaFold2 虚拟药物筛选和新药设计

文章目录 图神经网络1. Geometric Deep LearningRepresentation learning 表征学习机器学习的数据类型:序列、网格、图引出GNN 2. Graph Neural NetworksMachine Learning Lifecyclelearning graph is hardFeature Learning in GraphsWays to Analyze NetworksA Nai…

chatgpt赋能Python-python_plot标题

Python Plot 标题:如何让你的数据可视化更加引人注目 Python是数据科学和可视化领域中最受欢迎的编程语言之一。Python的可视化库让数据可视化变得非常容易、灵活和美观。 在创建一个数据可视化时,最重要的是让图表或图形作品的标题尽可能引人注目。这…

chatgpt赋能Python-python_plt_标题

Python plt:用Python创建出色的可视化图表 Python是一种广泛使用的高级编程语言,它被用于各种不同的领域,包括Web开发、数据科学、人工智能和计算机视觉等。Python拥有一个强大的生态系统,其中包括了大量的第三方库和工具&#x…

chatgpt赋能Python-python_property描述符

Python Property描述符:什么是Property? 介绍 在Python中,属性是一种非常强大的方式,在代码中隐藏数据并将其保护起来。我们可以使用属性来让代码更可读,更易于维护,并降低代码中的错误风险。 Python中&a…

一、服务端渲染技术NUXT

文章目录 一、服务端渲染技术NUXT1.1 什么是服务端渲染1.2 什么是NUXT 2、NUXT环境初始化2.1 下载压缩包2.2解压2.3修改package.json2.4修改nuxt.config.js2.5终端中进入项目目录安装依赖2.6 引入element-ui2.7 测试运行2.8 NUXT目录结构 3、封装axios3.1 安装axios3.2 封装axi…

抖音矩阵系统开发分析(附代码部分)

简介 本文档旨在介绍抖音SEO源码开发相关内容,包括技术架构、关键模块、实现原理等方面的内容。 技术架构 抖音SEO源码采用的是分布式架构。整个系统可以分为以下几个模块: 数据抓取模块:负责从抖音服务器抓取数据,并进行去重和…

一个公司,一个机器视觉工程师

​一个公司,一个机器视觉工程师。 大家觉得这种公司,这种情况可能很难,很尴尬。 其实一个公司,一个机器视觉工程师,公司业务上是有需求的,多数选择有经验的机器视觉工程师,我遇到的视觉人机器视觉粉丝里面还是比较多的。这样子的公司大多数是选择有经验的机器视觉工程师…