量化百科

用Python,tushare做一个A股每日收盘行情监测分析(含源代码)

由polll创建,最终由polll 被浏览 139 用户

**灵感:**对于交易者来说,每日收盘分析是一件必要的功课。现在的看盘软件种类很多,已经有很多整理好的数据,但是对于高阶玩家,可能需要更多自定义化的功能,做出自己的每日分析报表。那我们何不尝试用Python做一个?

先上结果:

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1731' height='773'></svg>)

好了,接下来就开始讲解下实现的方法和步骤。

开发环境IDE:Pycharm

编程语言: Python 3.6

必要包:tushare, pandas

解题思路拆解:

1. 如何获取每天的收盘数据?

2. 如何对每天的收盘数据进行分析?

解题过程:

1. 如何获取每天的收盘数据?

----他山之石可以攻玉。

  1. 如果有万得这种软件的朋友,可以自己从万得导出。

2)可以尝试编写爬虫从网易财经的股票频道抓取数据。

3)直接使用tushare包的api,提取数据

今天就来讲解第三种方法。

tushare官网 http://www.tushare.org/

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1861' height='949'></svg>)

安装方法请参考

刀客特鹿:Pyhton的package(包)安装方法​zhuanlan.zhihu.com 图标

tushare有很多获取数据的api可以很方便地直接调用,而我们只需要用到里面几个api就够用了,当然有兴趣的同学,可以把官网上的端口全部都自己尝试下。

第一个要用到的api:

get_today_all() # 获取所有股票的前一日的收盘行情

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='959' height='877'></svg>)

第二个要用到的api

get_stock_basics() # 获取股票当前的基本信息

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='828' height='575'></svg>)

有了这两个数据,就可以获取前一收盘日,或者今天收盘后的股票信息了。

源代码如下:

import tushare as ts
import pandas as pd
import time
import os
# 指定自己要存放文件的绝对路径
os.chdir('D:/all_trading_data/Every_days_analysis/input_data')
pd.set_option('expand_frame_repr', False)

# 从tushare获取指定日期
def get_today_all_ts(date):

date_now = date

# 先获得所有股票的收盘数据
df_close = ts.get_today_all()

   # 获得所有股票的基本信息
df_basics = ts.get_stock_basics()
df_all = pd.merge(left=df_close, right=df_basics, on='name', how='outer')

df_all['code'] = df_all['code'].astype(str) + ' '

# 保存数据
df_all.to_csv(str(date_now) + '_ts.csv', index=False, encoding='gbk')
print('%s is downloaded.' % (str(date_now)))
print(df_all)
return df_all

if __name__ == '__main__':
get_today_all_ts(date='20180214')

每天的收盘数据都可以保存下来,也方便也厚再分析

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='766' height='103'></svg>)

打开效果如下

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1888' height='703'></svg>)

2. 如何对每天的收盘数据进行分析?

这一步只要用到我们的pandas就可以了,菜有了,具体是清蒸?红烧?还是蒜烤?还要看各位的喜好。

比如我想看每天收盘的涨跌情况,涨跌停的分析,寻找行业动因等。

简单的数量统计

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='787' height='175'></svg>)

涨停股票按行业分类

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1713' height='815'></svg>)

跌停股票按行业分类

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1702' height='570'></svg>)

整体A股的行业涨跌情况

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1718' height='821'></svg>)

按交易所分类:

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1691' height='448'></svg>)

涨停股票按区域分类:

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1593' height='478'></svg>)

跌停股票按区域分类:

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1676' height='450'></svg>)

A股整体涨跌按区域分类:

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1612' height='825'></svg>)

源代码如下:

import pandas as pd
import requests
import tushare as ts
import os
import time
import warnings
warnings.filterwarnings('ignore')
pd.set_option('expand_frame_repr', False)
os.chdir('D:/all_trading_data/Every_days_analysis')
date_now = '20180214'
print(str(date_now))
# ====龙虎榜数据


# 读取TDX的每日股票数据
df = pd.read_csv('input_data/{}_ts.csv'.format(str(date_now)), encoding='gbk')
df.fillna(0, inplace=True)
df.replace('nan ', 0, inplace=True)
df['timeToMarket'] = pd.to_datetime(df['timeToMarket'])

df[['changepercent', 'pe', 'mktcap', 'nmc']] = df[['changepercent', 'pe', 'mktcap', 'nmc']].astype(float)
df['timeToMarket'] = pd.to_datetime(df['timeToMarket'])

df['code'] = df['code'].astype(str)  # 转化成str后,NAN也变成nan str格式
# 添加 交易所 列
df.loc[df['code'].str.startswith('3'), 'exchange'] = 'CY'
df.loc[df['code'].str.startswith('6'), 'exchange'] = 'SH'
df.loc[df['code'].str.startswith('0'), 'exchange'] = 'SZ'

# 找出上涨的股票
df_up = df[df['changepercent'] > 0.00]
# 走平股数
df_even = df[df['changepercent'] == 0.00]
# 找出下跌的股票
df_down = df[df['changepercent'] < 0.00]

# 找出涨停的股票
limit_up = df[df['changepercent'] >= 9.70]
limit_down = df[df['changepercent'] <= -9.70]

# 涨停股数中的未封板股,上市日期小于15天
limit_up_new = limit_up[pd.to_datetime(date_now) - limit_up['timeToMarket'] <= pd.Timedelta(15)]
# 涨停股数中次新股,上市日期小于1年
limit_up_fresh = limit_up[pd.to_datetime(date_now) - limit_up['timeToMarket'] <= pd.Timedelta(365)]

# 涨停股数中的未封板股,上市日期小于15天
limit_down_new = limit_down[pd.to_datetime(date_now) - limit_down['timeToMarket'] <= pd.Timedelta(15)]
# 涨停股数中次新股,上市日期小于1年
limit_down_fresh = limit_down[pd.to_datetime(date_now) - limit_down['timeToMarket'] <= pd.Timedelta(365)]

print('A股上涨个数: %d, A股下跌个数: %d, A股走平个数: %d。' % (df_up.shape[0], df_down.shape[0], df_even.shape[0]))
print('A股总成交额:%d, 总成交量:%d' % (df['amount'].sum(), df['volume'].sum()))
print('A股平均市盈率:%.2f, 平均流通市值 %.2f 亿, 平均总市值 %.2f 亿' % (df['pe'].mean(), df['nmc'].mean(), df['mktcap'].mean()))
print('涨停数量:%d 个, 涨停中上市日期小于15天的:%d, 涨停中上市日期小于1年的:%d' % (limit_up.shape[0], limit_up_new.shape[0], limit_up_fresh.shape[0]))
print('跌停数量:%d 个, 涨停中上市日期小于15天的:%d, 涨停中上市日期小于1年的:%d' % (limit_down.shape[0], limit_down_new.shape[0], limit_down_fresh.shape[0]))

# 获取指定列的分析统计结果
def get_output(df, columns='industry', name='_limit_up'):
   df = df.copy()
output = pd.DataFrame()
   output = pd.DataFrame(df.groupby(columns)['code'].count())

   output['pe_mean'] = df.groupby(columns)['pe'].mean()
   output['pe_median'] = df.groupby(columns)['pe'].median()

   output['nmc_mean'] = df.groupby(columns)['nmc'].mean()
   output['nmc_median'] = df.groupby(columns)['nmc'].median()

   output['mktcap_mean'] = df.groupby(columns)['mktcap'].mean()
   output['mktcap_median'] = df.groupby(columns)['mktcap'].median()

   output['volume_mean'] = df.groupby(columns)['volume'].mean()
   output['volume_median'] = df.groupby(columns)['volume'].median()

   output['amount_mean'] = df.groupby(columns)['amount'].mean()
   output['amount_median'] = df.groupby(columns)['amount'].median()

   output.sort_values('code', ascending=False, inplace=True)
   output.rename(columns={'code': name + '_count'}, inplace=True)
return output


for i in ['industry', 'exchange', 'area']:
# 对涨停的股票分析
output_limit_up = get_output(limit_up, columns=i, name='limit_up')
print(output_limit_up)
# 对跌停的股票分析
output_limit_down = get_output(limit_down, columns=i, name='limit_down')
print(output_limit_down)
# 对全量的股票分析
output_total = get_output(df, columns=i, name='total')
print(output_total)

\

标签

A股Python