Python之Tushare模块实现股票分析案例

Python之Tushare模块实现股票分析案例

一、Python之股票数据模块

目前有一个公开的股票数据等各种商业数据的模块,
主要适用于Python。
tushare模块便是这个公开的模块,其链接如下:
http://tushare.org/trading.html#id2
当然,如果直接到这个网页会有以下提示:
在这里插入图片描述
你直接点击跳转即可,因为原来这个已经不再更新了。
新的网址链接为:
https://waditu.com/document/41?doc_id=52
对于新的网址,你应该注册一个账户,否则无法获取信息,当然了,注册是免费的啦~~
在这里插入图片描述

二、股票分析案例的需求

1、获取数据;
2、找出股票收盘 > 开盘的日期;
3、找出开盘比前一天收盘低 2% 以上的日期。
4、具体的收益计算;
5、将获取到的数据绘制成一个图像。

另外:

DataFrame的介绍可以参见我的另一篇博文:
https://blog.csdn.net/m0_54218263/article/details/114501740

三、具体实现(讲解版本)

(注:我用的是新版的接口 !!)

1、获取数据

import pandas as pd
import numpy as np
import tushare as ts
import matplotlib.pyplot as plt
"""
pd : 数据处理模块
np : 数学模块
ts : 获取数据模块
plt : 绘图模块
"""
pro = ts.pro_api('614d0dfa6de5b8267a09a761707da53149622ea8cb1bdbbc14b659e4')
# 输入你自己的设备的api
# 这个是动态的~~~,你抄我的也没用~~~~
df = pro.daily(ts_code='000001.SZ', start_date='20190718', end_date='20210308')
# df 是一个 DataFrame 对象
# ts_code 是股票代码
# start_date 是开始日期
# end_date 世界树日期
print(df)

在这里插入图片描述
(注:我们获取到了397条数据,用DataFrame对象存储了起来 !!)

2、数据的预处理

(此处建议每操作一次就打印一次 df 对象,这样可以更好地理解整个过程)

df.to_csv('./data.csv')
# 存储数据
df = pd.read_csv('./data.csv')
# 读取文件中存储下来的数据
# 这样可以使我们不必重复访问Tushare
df = df.drop(['Unnamed: 0'], axis=1)
df = df.drop(['ts_code'], axis=1)
# 删除不需要的这两列数据!!!
df.iloc[::-1,:]
# 将数据的行进行倒置,原因是, df 中的时间是从后到前的
# print(df.info())--->查看数据类型
# 打印结果如下:
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 397 entries, 396 to 0
# Data columns (total 10 columns):
#  #   Column      Non-Null Count  Dtype  
# ---  ------      --------------  -----  
#  0   trade_date  397 non-null    int64  
#  1   open        397 non-null    float64
#  2   high        397 non-null    float64
#  3   low         397 non-null    float64
#  4   close       397 non-null    float64
#  5   pre_close   397 non-null    float64
#  6   change      397 non-null    float64
#  7   pct_chg     397 non-null    float64
#  8   vol         397 non-null    float64
#  9   amount      397 non-null    float64
# dtypes: float64(9), int64(1)
# memory usage: 31.1 KB
# None

# 1 、 将 trade_date 转换为 str 类型便于在转换为时间戳
for i in range(397):
	df.iloc[i, 0] = str(df.iloc[i, 0])
# 2 、 将 trade_date 转换为时间戳类型便于后续的操作
df['trade_date'] = pd.to_datetime(df['trade_date'])
# 将索引变为 'trade_date'
df.set_index(['trade_date'], inplace=True)

最终,预处理结束后,DataFrame对象变为了:
在这里插入图片描述

3、找出股票收盘 > 开盘的日期

data_1 = df.loc[df['close'] > df['open']].index
# 注意这里一定不能加()!!
print(data_1)


# 结果展示如下:
DatetimeIndex(['2019-07-18', '2019-07-19', '2019-07-24', '2019-07-25',
               '2019-07-26', '2019-07-29', '2019-07-30', '2019-08-01',
               '2019-08-06', '2019-08-07',
               ...
               '2021-01-28', '2021-01-29', '2021-02-01', '2021-02-03',
               '2021-02-04', '2021-02-05', '2021-02-18', '2021-03-02',
               '2021-03-03', '2021-03-04'],
              dtype='datetime64[ns]', name='trade_date', length=198, freq=None)

第二个需求也就实现了~~

4、找出开盘比前一天收盘低 2% 以上的日期

data_2 = df.loc[df['open'] < (1 - 0.02) * df['close'].shift(1)].index
"""
df['close'].shift(1):
整体向下移动一位
"""
print(data_2)


# 结果展示如下:
DatetimeIndex(['2019-08-02', '2019-08-15', '2020-02-03', '2020-03-09',
               '2020-03-13', '2020-03-23', '2020-03-30', '2021-02-02',
               '2021-02-04', '2021-02-26'],
              dtype='datetime64[ns]', name='trade_date', freq=None)

这个即就是第三个需求~~

5、具体的收益计算

具体的收益计算要求如下:
1、每个月交易的第一天买入100股;(以open计算)
2、当一年结束时卖出今年的所有股票;(以close计算)
3、日期以 start_date=‘20190718’, end_date=‘20210308’ 来计算;
4、求出收益的数值。

扫描二维码关注公众号,回复: 12887385 查看本文章
new_df_1 = df.resample('M').first()
# 找到一个月的第一次交易
payment = new_df_1['open'].sum() * 100

new_df_2 = df.resample('A').last()
# 找到一年的最后一次交易
# 这里注意  年  是:  A 来表示!!
# 计算收益是注意:
# 今年是2021,2021还没有结束,这一点是应该考虑到的
new_new_df_2 = new_df_2[0:2]
reward_1 = new_new_df_2['close'].sum() * 1200
# 2019 & 2020
reward_2 = new_df_2.iloc[2, 3] * 100 * 3
# 2021 的预估
reward = reward_2 + reward_1

result = reward - payment
print(result)



# 结果为:
16269.999999999993

因此,收益计算也就到此为止了,此例中最终是获利了的~~

(如果说,我的计算代码没有错的话,就是这个数值了,
但是如果有错的话,还请各位大佬们及时帮我纠正,一定要向我指出错误之处啊~
在这里,我就先谢谢各位大佬们了~
么么哒~~)

6、将获取到的数据绘制成一个图像

本操作有一点特殊,所以,代码必须重新写入。即需要重新构建一个Python文件,因为这里所用的东西与上面所需要的东西有一点冲突!!
代码如下:

这里,我们绘制交易数量与时间的散点图

import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts

pro = ts.pro_api('614d0dfa6de5b8267a09a761707da53149622ea8cb1bdbbc14b659e4')
df = pro.daily(ts_code='000001.SZ', start_date='20210101', end_date='20210308')

# 求出时间列表!!
df1 = df.iloc[:, 1:2]
for i in range(41):
    df1.iloc[i, 0] = str(df1.iloc[i, 0])
df1['trade_date'] = pd.to_datetime(df1['trade_date'])
list_date = list(df1['trade_date'])

# 求出交易数量列表
df2 = df.iloc[:, -1:]
list_amount = list(df2['amount'])
print(list_amount)

# 绘图
# 设置画布
plt.figure(figsize=(400, 600), dpi=25)
"""
c-->颜色
s-->画的圆点的大小
label-->标签名称
"""
plt.scatter(list_date, list_amount, c='red', s=300, label='Amount')
# x 轴
"""
rotation-->旋转多少度
size-->坐标名称的大小
"""
plt.xticks(list_date, rotation=90, size=30)
# y 轴
plt.yticks(list_amount, size=30)

# 设置轴的名称以及它们的样式:
plt.xlabel("Date", fontdict={
    
    'size': 50})
plt.ylabel("Amount", rotation=90, fontdict={
    
    'size': 50})
plt.title("Amount - Date -Picture", fontdict={
    
    'size': 70})
plt.legend(loc='best')

# 显示画面
plt.show()

结果展示如下所示:
(这里绘制的数据是一个相对的数值,是同时除以了一个数的,但显然是不影响结果的比较哒)
在这里插入图片描述
注意设置点的大小,不然就会像下图一样看不清了:

在这里插入图片描述
这里强调一个事情,就是说,Amount千万不要转成字符串,否则会像下面这张图了啊www:
在这里插入图片描述

四、具体实现(具体实现的整合版本)

在整合中,我们调整了各个任务完成的顺序以便于可以在一个Python文件中实现。

这里请参见我的另一篇博文:
“Python之Tushare模块实现股票分析案例整合版”

五、总结

以上就是一个简单的股票分析案例的举例,这个案例比较简单,但是可以作为入门的第一个分析案例还是很不错的,因此将其整理下来供大家进行参考,希望对大家有所帮助~~
最后呢,
感谢大家的支持,
喜欢的话就点个赞嘛~~~

猜你喜欢

转载自blog.csdn.net/m0_54218263/article/details/114550380