如何用python主抓取股市数据并分析?

389 篇文章 8 订阅
373 篇文章 5 订阅

导读:在本文中我们研究白酒股票市场的数据。使用baostock来获取股票信息,可视化它们的不同,最后将使用一些方法来分析股票的风险,基于其以前的历史表现。我们还将通过长期短期记忆(LSTM)方法来预测未来的股票价格。注意,本文是对股票价格预测的初级尝试,股票的预测是一个很大的学问,并不是通过一文就能解决的。

本文从如下几个方面展开:

  1. 一段时间内股票价格的变化是多少?
  2. 股票的平均日回报率是多少?
  3. 各种股票的移动平均线是多少?
  4. 不同股票之间的相关性是什么?
  5. 我们投资某只股票的风险是多少?
  6. 我们如何预测未来的股票行为呢?(使用LSTM预测贵州茅台的收盘价)

要预测股票趋势,通常需要历史的各类交易价格数据来进行模型的搭建。“历史惊人的相似”是股票趋势判断问题的重要假设。通常我们的思维是,股票某一天的交易价格受到该交易日前面的许多交易日的影响,而股价的确定则是由买卖市场双方共同决定的。当我们收盘股票数据集时,应该将多个开盘日归入参考范畴。本文将前 N 个交易日作为一个时间窗口,并设为训练集,将第 N+1 个交易日作为测试集,预测测第 N+2 个交易日的股票趋势情况。通过滑动窗口的方法,设每次滑动窗口移动的距离为 1(即 1 天),则在初始 T 个交易日上能够构造多个训练集和测试集,且训练样本的数据始终等于 N。

股票的价格随时间变化

股市数据的获取方法详情,请参见python获取股市数据,另外将学习如何分析股票的基本。

导入需要用到的模块

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
plt.style.use("fivethirtyeight")
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
%matplotlib inline
from datetime import datetime
import baostock as bs

定义获取股市数据

def get_data(code):
    end = datetime.now()
    start = datetime(end.year - 1, end.month, end.day).strftime('%Y-%m-%d')
    end = end.strftime('%Y-%m-%d')
    # 登陆系统
    lg = bs.login()
    # 获取沪深A股历史K线数据
    rs_result = bs.query_history_k_data_plus(
            code,
            fields="date,open,high,low,close,volume",
            start_date=start, 
            end_date=end, 
            frequency="d", 
            adjustflag="3")
    df_result = rs_result.get_data()
    # 登出系统
    bs.logout()
    df_result['date'] = df_result['date'].map
                        lambda x: datetime.strptime(x,'%Y-%m-%d'))
    _res = df_result.set_index('date')
    res = _res.applymap(lambda x: float(x))
    return res

选择四个白酒股票近一年内的历史交易数据,分别为贵州茅台,五粮液, 洋河股份,山西汾酒。其股票代码分别是'sh.600519', 'sz.000858', 'sz.002304', 'sh.600809'

liquor_list = ['sh.600519', 'sz.000858', 
               'sz.002304', 'sh.600809']
# 贵州茅台,五粮液, 洋河股份,山西汾酒
company_name = ['maotai','wuliangye','yanghe','fenjiu']
for name, code in zip(company_name ,liquor_list):
    exec(f"{name}=get_data(code)")

注意这里使用高阶函数exec进行批量赋值。

# 需要批量赋值的变量名称
company_list = [maotai, wuliangye, yanghe, fenjiu]
for company, com_name in zip(company_list, company_name):
    company["company_name"] = com_name
# 将四支股票数据进行纵向合并
df = pd.concat(company_list, axis=0)
df.tail(10)

在这里插入图片描述

历史收盘价

绘制四支股票的历史收盘价,从历史收盘价格趋势图大致可以看出,四支股票的趋势很相似。

plt.figure(figsize=(15, 6))
plt.subplots_adjust(top=1.25, bottom=1.2)
for i, company in enumerate(company_list, 1):
    plt.subplot(2, 2, i)
    company['close'].plot()
    plt.ylabel('close')
    plt.xlabel(None)
    plt.title(f"Closing Price of {company_name[i - 1]}")  
plt.tight_layout()

在这里插入图片描述

每日交易量

现在我们画出每天的股票交易量。从图中可以看出很多信息,感兴趣的小伙伴们可以研究研究。

plt.figure(figsize=(15, 7))
plt.subplots_adjust(top=1.25, bottom=1.2)
for i, company in enumerate(company_list, 1):
    plt.subplot(2, 2, i)
    company['volume'].plot()
    plt.ylabel('volume')
    plt.xlabel(None)
    plt.title(f"Sales Volume for {company_name[i - 1]}") 
plt.tight_layout()

在这里插入图片描述
现在,我们已经看到了可视化的每日收盘价和成交量,接下来计算股票的移动平均线。

各股票的移动平均线

移动平均算法(MigAeage)是一种典型的处理[时间序列数据]的算法模型,而股票的价格跟着时间不断变化的一种数据,是典型的时间序列数据,因此利用移动平均算法对股票价格进行预测是股票趋势预测研究中最基础也是最典型的模型。

[移动平均算法]的核心思想是利用前一阶段的真实的数据值,依次利用特定的计算一定范围内的所考虑项目的随机机值,例如在股票趋势预测中是股票的价格,因此在具有周期性或者波动性较大的应用场景中,[移动平均]的实际结果准确率会受到一定的影响。

# 设置移动天数
ma_day = [10, 20, 50]
for ma in ma_day:
    for company in company_list:
        column_name = f"MA for {ma} days"
        company[column_name] = company['close'].rolling(ma).mean()

现在继续绘制所有额外的移动平均线。

fig, axes = plt.subplots(nrows=2, ncols=2)
fig.set_figheight(8)
fig.set_figwidth(15)
maotai[['close', 'MA for 10 days', 'MA for 20 days', 'MA for 50 days']].plot(ax=axes[0,0])
axes[0,0].set_title('贵州茅台')

wuliangye[['close', 'MA for 10 days', 
          'MA for 20 days', 'MA for 50 days']
          ].plot(ax=axes[0,1])
axes[0,1].set_title('五粮液')

yanghe[['close', 'MA for 10 days', 
        'MA for 20 days', 'MA for 50 days']
        ].plot(ax=axes[1,0])
axes[1,0].set_title('洋河股份')

fenjiu[['close', 'MA for 10 days', 
        'MA for 20 days', 'MA for 50 days']
        ].plot(ax=axes[1,1])
axes[1,1].set_title('山西汾酒')
fig.tight_layout()

在这里插入图片描述

股票的平均日回报率是多少?

现在我们已经完成了一些基本分析,现在进一步深入研究。现在我们来分析一下股票的风险。这里需要仔细观察股票的每日变化趋势。使用pct_change来查找每天的百分比变化。

for company in company_list:
    company['Daily Return'] = company['close'].pct_change()
# 画出日收益率
fig, axes = plt.subplots(nrows=2, ncols=2)
fig.set_figheight(8)
fig.set_figwidth(15)
maotai['Daily Return'].plot(ax=axes[0,0], legend=True, 
                            linestyle='--', marker='o')
axes[0,0].set_title('贵州茅台')
wuliangye['Daily Return'].plot(ax=axes[0,1], legend=True, 
                               linestyle='--', marker='o')
axes[0,1].set_title('五粮液')
yanghe['Daily Return'].plot(ax=axes[1,0], legend=True, 
                            linestyle='--', marker='o')
axes[1,0].set_title('洋河股份')
fenjiu['Daily Return'].plot(ax=axes[1,1], legend=True, 
                            linestyle='--', marker='o')
axes[1,1].set_title('山西汾酒')
fig.tight_layout()

在这里插入图片描述
现在用直方图来全面看看平均日收益。我们将使用seaborn在同一图上创建直方图和kde图。

# 注意这里使用了dropna(),否则seaborn无法读取NaN值
plt.figure(figsize=(12, 7))
company_name_c = ['贵州茅台','五粮液','洋河股份','山西汾酒']
for i, company in enumerate(company_list, 1):
    plt.subplot(2, 2, i)
    sns.distplot(company['Daily Return'].dropna(), bins=100, color='purple')
    plt.ylabel('Daily Return')
    plt.title(f'{company_name_c[i - 1]}')
# 也可以这样绘制
# maotai['Daily Return'].hist()
plt.tight_layout();

在这里插入图片描述

股票收盘价之间的相关性

如果想分析中所有股票的回报呢?

可以将每个股票数据框构建一个包含所有['Close']列的DataFrame。将所有的收盘价为白酒股列表到一个DataFrame

index = maotai.index
closing_df = pd.DataFrame()
for company, company_n in zip(company_list,company_name_c):
    temp_df = pd.DataFrame(index=company.index,
                           data = company['close'].values ,
                           columns=[company_n])
    closing_df = pd.concat([closing_df,temp_df],axis=1)
# 看看数据
closing_df.head() 

在这里插入图片描述

现在我们有了所有的收盘价,让我们继续获取所有股票的日回报,就像我们对茅台股票做的那样。

liquor_rets = closing_df.pct_change()
liquor_rets.head()

在这里插入图片描述
现在可以比较两支股票的日收益率来检验相关性。

首先让我们看一只股票和它本身的比较。将贵州茅台股票与自身进行比较,应该会显示出一个完美的线性关系

sns.jointplot('maotai', 'maotai', 
              tech_rets, kind='scatter', 
              color='seagreen')

在这里插入图片描述
我们将使用joinplot来比较贵州茅台和五粮液的日收益。

sns.jointplot('贵州茅台', '五粮液', 
              liquor_rets, kind='scatter')

在这里插入图片描述
因此,现在可以看到,如果两个股票是完全(和正的)相互相关,它的日回报值之间的线性关系应该发生。

Seaborn和使得我们很容易对我们的技术股票行情列表中的每一个可能的股票组合重复这种比较分析。我们可以使用sns.pairplot() 自动创建这个绘图。

可以简单地调用上的pairplot来对所有比较进行自动可视化分析

sns.pairplot(liquor_rets, kind='reg')

在这里插入图片描述
上面我们可以看到所有股票之间的日回报关系。快速浏览一下贵州茅台和五粮液日收益之间的有趣关联。研究这种个体比较可能会很有趣。

虽然仅仅调用sns.pairplot()非常简单,但也可以使用sns.pairgrid()来完全控制图形,包括对角线上的哪种图、上三角形和下三角形。下面是一个充分利用[seaborn]的力量来实现这一结果的例子。

# 通过命名为returns_fig来设置我们的图形,
# 在DataFrame上调用PairPLot
return_fig = sns.PairGrid(liquor_rets.dropna())
# 使用map_upper,我们可以指定上面的三角形是什么样的。
return_fig.map_upper(plt.scatter, color='purple')
# 我们还可以定义图中较低的三角形,
# 包括绘图类型(kde)或颜色映射(blueppurple)
return_fig.map_lower(sns.kdeplot, cmap='cool_d')
# 最后,我们将把对角线定义为每日收益的一系列直方图
return_fig.map_diag(plt.hist, bins=30)

在这里插入图片描述

使用同样的方法,绘制四支股票的收盘价相关图。

returns_fig = sns.PairGrid(closing_df)
returns_fig.map_upper(plt.scatter,color='purple')
returns_fig.map_lower(sns.kdeplot,cmap='cool_d')
returns_fig.map_diag(plt.hist,bins=30)

在这里插入图片描述

最后,我们还可以做一个相关图,以得到股票日收益值之间的相关性的实际数值。通过比较收盘价格,我们发现了微软和苹果之间有趣的关系。

# 让我们用sebron来做一个每日收益的快速相关图
sns.heatmap(liquor_rets.corr(), 
            annot=True, cmap='summer')

在这里插入图片描述

sns.heatmap(closing_df.corr(), 
            annot=True, cmap='summer')

在这里插入图片描述
这验证了前面的分析结果,从数字和视觉上看到五粮液和其他几个白酒股票收益率有最强的相关性。有趣的是,所有的白酒都是正相关的。

股票投资的风险

金融风险往往来源于未来的不确定性。我们通常假设股票价格服从[对数正态分布],因而股票回报率服从正态分布。基于此假设,股票回报率的标准房差常用来度量金融风险,也称为波动率。

我们有很多方法来量化风险,其中一个最基本的方法是利用我们收集的关于日收益率百分比的信息将预期收益率与日收益率的标准差进行比较。

# 让我们首先将一个新的DataFrame定义为原始liquor_rets的 DataFrame的压缩版本
rets = liquor_rets.dropna()
area = np.pi * 20
plt.figure(figsize=(10, 7))
plt.scatter(rets.mean(), rets.std(), s=area)
plt.xlabel('预期回报',fontsize=18)
plt.ylabel('风险',fontsize=18)

for label, x, y in zip(rets.columns, rets.mean(), rets.std()):
    if label == '山西汾酒':
        xytext=(-50,-50)
    else:
        xytext=(50,50)
    plt.annotate(label, xy=(x, y), xytext=xytext, 
                 textcoords='offset points', 
                 ha='right', va='bottom', fontsize=15,
                 arrowprops=dict(arrowstyle='->', 
                                 color='gray', 
                                 connectionstyle='arc3,rad=-0.3'))

在这里插入图片描述

贵州茅台收盘价预测

# 获取股票报价
df = maotai.loc[:,['open','high','low','close','volume']]
df.head()

在这里插入图片描述

可视化收盘价

plt.figure(figsize=(16,6))
plt.title('历史收盘价',fontsize=20)
plt.plot(df['close'])
plt.xlabel('日期', fontsize=18)
plt.ylabel('收盘价 RMB (¥)', fontsize=18)
plt.show()

在这里插入图片描述

# 创建一个只有收盘价的新数据帧
data = df.filter(['close'])
# 将数据帧转换为numpy数组
dataset = data.values
# 获取要对模型进行训练的行数
training_data_len = int(np.ceil( len(dataset) * .95 ))
# 数据标准化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0,1))
scaled_data = scaler.fit_transform(dataset)
# 创建训练集,训练标准化训练集
train_data = scaled_data[0:int(training_data_len), :]
# 将数据拆分为x_train和y_train数据集
x_train = []
y_train = []
for i in range(60, len(train_data)):
    x_train.append(train_data[i-60:i, 0])
    y_train.append(train_data[i, 0])
    if i<= 61:
        print(x_train)
        print(y_train)     
# 将x_train和y_train转换为numpy数组 
x_train, y_train = np.array(x_train), np.array(y_train)
# Reshape数据
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))

使用LSTM模型预测股价

# pip install keras
from keras.models import Sequential
from keras.layers import Dense, LSTM
# 建立LSTM模型
model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape= (x_train.shape[1], 1)))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))
# 编译模型
model.compile(optimizer='adam', loss='mean_squared_error')
# 训练模型
model.fit(x_train, y_train, batch_size=1, epochs=1)

170/170 [==============] - 7s 25ms/step - loss: 0.0253
# 创建测试数据集
# 创建一个新的数组,包含从索引的缩放值
test_data = scaled_data[training_data_len - 60: , :]
# 创建数据集x_test和y_test
x_test = []
y_test = dataset[training_data_len:, :]
for i in range(60, len(test_data)):
    x_test.append(test_data[i-60:i, 0])    
# 将数据转换为numpy数组
x_test = np.array(x_test)
# 重塑的数据
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1 ))
# 得到模型的预测值 
predictions = model.predict(x_test)
predictions = scaler.inverse_transform(predictions)
# 得到均方根误差(RMSE)
rmse = np.sqrt(np.mean(((predictions - y_test) ** 2)))

将训练数据、实际数据集预测数据可视化。

train = data[:training_data_len]
valid = data[training_data_len:]
valid['Predictions'] = predictions
plt.figure(figsize=(16,6))
plt.title('模型')
plt.xlabel('日期', fontsize=18)
plt.ylabel('收盘价 RMB (¥)', fontsize=18)
plt.plot(train['close'])
plt.plot(valid[['close', 'Predictions']])
plt.legend(['训练价格', '实际价格', '预测价格'], loc='lower right')
plt.show()

在这里插入图片描述

显示有效和预测的价格

valid

在这里插入图片描述

最后

在学习python中有任何困难不懂的可以微信扫描下方CSDN官方认证二维码加入python交流学习
多多交流问题,互帮互助,这里有不错的学习教程和开发工具。

👉[[CSDN大礼包:《python安装包&全套学习资料》免费分享]]安全链接,放心点击

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python必备开发工具

在这里插入图片描述

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

六、Python练习题

检查学习结果。
在这里插入图片描述

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述
最后我自己整理了一些学习资料,都是别人分享给我的,希望对你们有帮助。

  • 5
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要用Python进行数据分析,需要使用一些第三方库和工具。下面是使用Python进行数据分析的一些基本步骤: 1. 准备数据:首先需要准备一份TXT文本文件。确保文件路径正确,并且文本内容格式正确。 2. 导入必要的库:Python中有许多库可以用于数据分析,如NumPy、Pandas、Matplotlib等。在开始数据分析之前,需要导入这些库。 ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt ``` 3. 读取文本文件:使用Pandas库中的`read_csv()`函数可以读取文本文件并将其转换为DataFrame格式。 ```python df = pd.read_csv('filename.txt', delimiter='\t', header=None) ``` 其中,`delimiter`参数指定了分隔符,这里是Tab键;`header`参数指定是否包含列名,这里是没有列名的。 4. 数据清洗和预处理:在对数据进行分析之前,需要对数据进行清洗和预处理。这可能包括删除无用的列、处理缺失值、标准化数据等。 ```python # 删除第一列和第三列 df.drop([0, 2], axis=1, inplace=True) # 处理缺失值 df.fillna(0, inplace=True) # 标准化数据 df = (df - df.mean()) / df.std() ``` 5. 数据分析和可视化:完成数据清洗和预处理后,可以进行数据分析和可视化。这可以使用NumPy、Pandas和Matplotlib等库进行。 ```python # 计算均值、中位数、标准差等统计量 print(df.mean()) print(df.median()) print(df.std()) # 绘制直方图 df.plot.hist(bins=20) # 绘制散点图 df.plot.scatter(x=0, y=1) ``` 这些步骤只是数据分析的基础,具体的分析方法和可视化方式取决于具体问题和数据类型。 ### 回答2: 要用Python进行数据分析,可以按照以下步骤处理一份TXT文本数据: 1. 导入所需的库:首先,需要导入Python中的相关库,如numpy、pandas和matplotlib等。这些库提供了进行数据处理和分析的常用函数和工具。 2. 读取数据:使用pandas库中的read_csv函数来读取TXT文本文件,并加载到一个数据框中。可以通过指定分隔符、列名等参数来确保数据的正确加载。 3. 数据预处理:对于数据分析,通常需要进行一些数据清洗和预处理工作。可以使用pandas库提供的函数进行数据过滤、去除缺失值、处理异常数据等操作。 4. 数据分析:根据具体问题,选择合适的统计分析方法。可以使用numpy库进行数值计算和统计分析,如计算均值、中位数、方差等。还可以使用pandas库进行数据聚合、透视表等高级数据处理操作。 5. 数据可视化:使用matplotlib库中的函数,通过制作图表和图形,将数据可视化。这样可以更直观地呈现数据分析结果,如绘制折线图、柱状图、散点图等。 6. 结果报告:最后,根据分析结果来撰写一份数据分析报告。可以使用Python的文本处理库,如docx库来生成报告文档,并通过将结果导出为CSV或Excel文件来保存。 通过以上步骤,就可以使用Python进行数据分析了。当然,在实际应用中,可能需要根据具体问题和数据特点做一些额外的处理和分析工作,但以上基本步骤可以作为一个指导来帮助完成数据分析任务。 ### 回答3: 使用Python进行数据分析可以利用Python的强大的数据处理和分析库,如pandas、numpy、matplotlib等。 首先,需要将TXT文本数据读入Python中。可以使用pandas库中的read_csv函数来读取TXT文件,并将其转换为DataFrame格式进行进一步分析。 接下来,可以使用pandas和numpy库对数据进行清洗和预处理。通过去除无效数据、填充缺失值、数据类型转换等操作,使得数据符合分析所需的格式。 在数据预处理完成后,可以利用pandas和numpy库对数据进行统计分析。例如,可以使用pandas的describe函数来计算数据的基本统计量,如平均值、中位数、最大值、最小值等。此外,还可以使用pandas和numpy提供的函数进行数据聚合、分组、筛选等操作。 此外,使用matplotlib库可以进行数据可视化分析。可以使用matplotlib的各种绘图函数,如折线图、柱状图、饼图等,来展示数据的分布情况、趋势、比较等。 最后,可以根据数据分析的需求,结合以上操作,对TXT文本数据进行更深入的分析。可以使用Python提供的统计学和机器学习库,如scipy、scikit-learn等,进行更高级的数据分析,如回归、分类、聚类等。 总之,使用Python进行数据分析,可以通过pandas库对数据进行读取、清洗和预处理,利用numpy库进行数据统计分析,使用matplotlib库进行数据可视化分析,并结合其他统计学和机器学习库进行更深入的数据分析

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值