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

文章目录

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

前言:

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

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

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

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

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

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

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

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

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

1. 导入相关包

# 导入所需库和模块:
from tscv import gap_train_test_split
from catboost import CatBoostRegressorimport torch
import torch.nn as nn
import pandas as pd
import numpy as np
from matplotlib import pyplot as pltimport 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_scorerfrom 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_dfB_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.dayoriginal_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' datafor i in range(1, 6):year = year_num - iprint(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 = lenya01lenyear = len(original_data[original_data['Year'] == year])elif i==2:
#             lenyear = lenya01 + lenya02lenyear = len(original_data[original_data['Year'] == year-1] )+ len(original_data[original_data['Year'] == year])elif i==3:
#             lenyear = lenya01 + lenya02 + lenya03lenyear = 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 + lenya04lenyear = 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 + lenya05lenyear = 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 = 60X = 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_predtmp_verification = X_verification_copyx_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, VectorIndexerfrom 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 SVRfrom 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 LGBMRegressorimport 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 tickerwarnings.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.rhkb.cn/news/8625.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用chatSonic代替chatGPT实现代码智能编写与应答

WriteSonic地址 WriteSonic—其中,提供chatSonic功能app. 注册 使用google账户登录即可. 界面 登录后的界面](https://img-blog.csdnimg.cn/bff0283f8b5f43dd8483caef62784b37.png) 使用 点击上图中的chatSonic链接. 问答窗口 测试智能编码 在文本框中输入…

有了ChatGPT 微软对元宇宙不香了?

押注ChatGPT是微软最近的主要发力点,另一边,它开始向元宇宙业务挥出裁员“大刀”。海外消息称,微软解散了成立仅四个月的工业元宇宙团队,约100名员工被全被解雇。 这只是微软放缓元宇宙战略的长尾动作,此前&#xff0…

ChatGPT 之父推出加密货币钱包;Intel 被曝预算砍掉 10%、裁员 20%;Firefox 113 发布|极客头条...

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&#…

阿里版ChatGPT突然上线邀测!大模型热战正剧开始,这是第一手体验实录

阿里正式加入ChatGPT战局! 就在刚刚,阿里版类ChatGPT突然官宣正式对外开放企业邀测。 它叫通义千问,由达摩院开发。 嗯,是大模型版十万个为什么那个味儿了。 事实上,早在这个月初,就传出过不少阿里要推出…

python 调试大法

说在前面 我觉得没有什么错误是调试器无法解决的,如果没有,那我再说一遍,如果有,那当我没说 一、抛出异常 可以通过 raise 语句抛出异常,使程序在我们已经知道的缺陷处停下,并进入到 except 语句 raise…

获得北大新材料学院夏令营offer的艰险历程(附面试答辩PPT)

知乎原文获得北大新材料学院夏令营offer的艰难历程(附面试答辩PPT) - 知乎 视频版 05:27 获得北大新材料学院夏令营offer的艰险历程 科大云炬 的视频 698 播放 文字版 相继6月15日以来北大、清华、浙大、西交、复旦、大连理工等10几个夏令营被拒后,我被打击得渐…

概率图模型 - 学习笔记

文章目录 教材与公开课视频概率图模型例子如何理解BP算法?概率图模型相比有监督学习的优势 教材与公开课视频 国外经典教材 英文版:Probabilistic Graphical Models: Principles and Techniques中文版:《概率图模型:原理与技术》…

从文本创建艺术,AI图像生成器的数据集是如何构建的

AIGC系列分享是整数智能推出的一个全新分享系列,在这个系列中,我们将介绍与AIGC概念相关的有趣内容。AIGC系列主要分为以下几篇文章: 被称为下一代风口的AIGC到底是什么? AIGC的数据集构建方案分享系列 从文本创建艺术&#xff0c…

【軟體架構師如何煉成?硬功夫軟技能點滿技能樹】

軟體架構師如何煉成?硬功夫軟技能點滿技能樹 協助企業資訊系統轉型,架構師擔任關鍵角色如何成為軟體架構師技術領域硬技能職場領域軟技能結語 協助企業資訊系統轉型,架構師擔任關鍵角色 「人無遠慮,必有近憂」,套用到…

巧用提示语,说说话就能做个聊天机器人

你好,我是徐文浩。 这一讲,我们来看看Open AI提供的Completion这个API接口。相信已经有不少人试过和ChatGPT聊天了,也有过非常惊艳的体验,特别是让ChatGPT帮我们写各种材料。那么,我们不妨也从这样一个需求开始吧。 …

量化选股——基于动量因子的行业风格轮动策略(第1部分—因子测算)

文章目录 动量因子与行业轮动概述动量因子的理解投资视角下的行业轮动现象投资者视角与奈特不确定性 动量因子在行业风格上的效果测算动量因子效果测算流程概述1. 行业选择:申万一级行业2. 动量因子选择:阿隆指标(Aroon)3. 测算方…

苹果微软等科技巨头紧急叫停,chatgpt翻车了?(文末附联名信)

一、千名大佬集体叫停GPT研发 3月29日,一封联名信刷爆了各大媒体热榜,上面有一千多位大佬签名,其中包括埃隆马斯克、约书亚本吉奥(Yoshua Bengio,2018年图灵奖获得者)和史蒂夫沃兹尼亚克(Steve…

免费!终极ChatGPT提示+Midjourney宝藏神图,1200+图片,震撼人心

新智元报道 编辑:Aeneas 【新智元导读】一位网友花费一周,用从ChatGPT生成的prompt,在Midjourney中生成了一千多张精彩的作品。 Midjourney虽然功能神奇,但在prompt能力平平的人手里,它并不能绽放自己的魔力。 国外的…

ChatGPT专业应用:生成各类通知

正文共 821 字,阅读大约需要 3 分钟 游戏/用户运营等必备技巧,您将在3分钟后获得以下超能力: 生成各类通知 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | nanako 编辑者 | Linda ●…

ChatGPT Plus停售 留出防治AI风险空窗期

能体验GPT-4模型的ChatGPT,因需求量太大而暂停了升级为Plus的功能,算力似乎爆表了。 这下,有钱都没地儿充会员了,用户们暂时需要回到“GPT-3.5时代”。这或许留给人类一个空窗期,可以好好思考一下前段时间上千名科技精…

【重制版】10分钟学会WINDOWS、MAC、LINUX如何安装GPT桌面版

文章目录 1 前言2 Windows版下载安装2.1 安装包2.2 winget下载 (注意看,不是wget!) 3 Mac版下载安装3.1 安装包3.2 homebrew安装 4 Linux版下载安装4.1 安装包4.2 终端下载 5 特点5.1 软件特点5.2 菜单功能(个人喜好特…

英伟达黄老板成身价350亿美元CEO!做AIGC淘金时代送铲子的

Datawhale干货 英伟达CEO:黄仁勋,来源:新智元 【导读】90年代显卡芯片的红海市场中,为什么是英伟达脱颖而出?3D、矿卡、移动构架、人工智能,老黄带着英伟达,踏准了一个个风口,笑到了…

【人工智能】人工智能行业研究:史上最伟大的科技革命

【人工智能】人工智能行业研究:史上最伟大的科技革命 目录 【人工智能】人工智能行业研究:史上最伟大的科技革命

BFT最前线 | iOS版ChatGPT周下载突破50万人次;英伟达市值突破万亿美元创造芯片公司历史;华为开发者大会即将发布

原创 | 文 BFT机器人 AI视界 TECHNOLOGY NEWS 01 联合国教育部聚焦生成式AI 联合国科教文组织提出发展路线图 近日,为应对生成式人工智能技术的迅速发展,联合国教科文组织就此议题召开了首次全球教育部长会议。40多位部长分享了将这些工具融入教育的…

从应用火到股市 AIGC概念股连涨仨月

AI有变革生产力之势,证券市场闻风而动。同花顺数据显示,AIGC概念指数年内上涨近60%,涨幅是上证指数的10倍多。 具体到个股,软通动力、远大智能等搭上AI风口的企业服务商“老树发新芽”,直接涨停。游戏板块霸榜产品回报…