1. 简介

近期因为新型肺炎疫情的缘故, 呆在家里想着学习一点Python数据采集与分析相关的内容,于是决定从股票数据入手,做一些简单的数据采集与分析的实战工作。在网上看了一点资料,决定使用Tushare库来完成数据采集,并通过pyecharts进行简单的数据统计和分析。

2. 数据采集

Tushare是一个用于金融数据获取与量化交易方面的Python数据内容平台,其提供的数据内容包含股票、基金、期货、债券、外汇、行业大数据,同时包括了数字货币行情等区块链数据的全数据品类的金融大数据平台,为各类金融投资和研究人员提供适用的数据和工具。

大家对Tushare感兴趣的话,可以前往Tushare官网了解相关的文档。

吐槽一下:Tushare Pro版本虽增加了许多数据接口, 但是需要一定的积分, 这个就有点让人难受, 很多功能没有积分就用不了, 还不如以前的版本好用,至少很多数据不需要积分就可以直接获取。

准备工作:

创建stockdb数据库

创建tb_stock_info数据表(数据表列名与Tushare的股票列表输出参数一致)

下面是使用Tushare进行股票基础数据采集的源代码, 使用Tushare接口时需要使用Token,大家可以自行在Tushare网站上注册:

# -*- coding: utf-8 -*-

"""

Created on 2020年2月4日

@author: garyond

"""

# 导入模块

from datetime import datetime, timedelta, time # 时间处理函数

import pymysql # mysql操作库

import pandas as pd

import numpy as np

import tushare as ts

# 全局对象

# 本地

mysqlSetting_local = {

'host': "localhost",

'port': 3306,

'user': "root",

'passwd': "",

'db': "stockdb",

'charset': 'utf8'

}

# 执行sql语句

def execSql(mysqlSetting, sql):

# 打开数据库连接

db = pymysql.connect(host=mysqlSetting['host'], port=mysqlSetting['port'], user=mysqlSetting['user'], \

passwd=mysqlSetting['passwd'], db=mysqlSetting['db'], charset=mysqlSetting['charset'])

# 使用cursor()方法获取操作游标

cursor = db.cursor()

cursor.execute(sql)

ret = cursor.fetchall()

db.commit()

# 关闭数据库连接

db.close()

return ret

# DataFrame对象落地数据库

def saveStockData(mysqlSetting, df, tableName):

# 打开数据库连接

db = pymysql.connect(host=mysqlSetting['host'], port=mysqlSetting['port'], user=mysqlSetting['user'],\

passwd=mysqlSetting['passwd'], db=mysqlSetting['db'], charset=mysqlSetting['charset'])

# 使用cursor()方法获取操作游标

cursor = db.cursor()

# 添加操作的sql语句

sqlInsert = "REPLACE INTO " + tableName + " ("

# 获取Columns信息

for _index, column in enumerate(df.columns):

if _index < len(df.columns) - 1:

sqlInsert = sqlInsert + column + ','

else:

sqlInsert = sqlInsert + column + ') VALUES '

# 迭代DataFrame数据

for index, row in df.iterrows():

sqlInsertNew = sqlInsert + '('

for i, column in enumerate(df.columns):

if i < len(df.columns) - 1:

if pd.isnull(row[column]) or row[column] == 0:

sqlInsertNew = sqlInsertNew + 'NULL' + ','

else:

sqlInsertNew = sqlInsertNew + '\'' + str(row[column]) + '\'' + ','

# sqlInsertNew=sqlInsertNew+'\''+str(row[column])+'\''+','

else:

if pd.isnull(row[column]) or row[column] == 0:

sqlInsertNew = sqlInsertNew + 'NULL'

else:

sqlInsertNew = sqlInsertNew + '\'' + str(row[column]) + '\''

sqlInsertNew = sqlInsertNew + ');'

print(sqlInsertNew)

cursor.execute(sqlInsertNew)

db.commit()

# 关闭数据库连接

db.close()

if __name__ == '__main__':

ts.set_token('712ce0fbfe30aa3e436a961a33360520182e36ebc9a6fb0e13fc5b12')

pro = ts.pro_api()

# 获取股票数据

data = pro.stock_basic(exchange='', list_status='', fields='ts_code,symbol,name,area,industry,fullname,market,exchange,curr_type,list_status,list_date,is_hs')

# 插入数据库

saveStockData(mysqlSetting_local, data, "tb_stock_info")

3. 基础数据分析

注:以下代码使用Jupyter Notebook进行管理与记录

1. 沪深股市上市司地域分布情况

from pyecharts import options as opts

from pyecharts.charts import Map

import pandas as pd

# 定义Map地图

def map_base() -> Map:

conn = pymysql.connect(host='127.0.0.1', port=3306,\

user='root',password='', \

db='stockdb',charset='utf8', \

use_unicode=True)

sql = "select area,count(symbol) as value from tb_stock_info where exchange = 'SSE' and area is not null group by area order by count(symbol) desc"

df = pd.read_sql(sql, con=conn)

sql2 = "select area,count(symbol) as value from tb_stock_info where exchange = 'SZSE' and area is not null group by area order by count(symbol) desc"

df2 = pd.read_sql(sql2, con=conn)

c = (

Map()

.add("沪市上市公司数量", df.values, "china")

.add("深市上市公司数量", df2.values, "china")

.set_global_opts(title_opts=opts.TitleOpts(title="沪深股市地域分布图"))

)

conn.close()

return c

# 地图渲染到Jupyter NoteBook中

map_base().render_notebook()

代码执行如下图所示:

沪深股市地域分布图

2. 沪深股通标的物分布情况

from pyecharts import options as opts

from pyecharts.charts import Pie

import pandas as pd

# 生成饼图

def stat_stock_subject() -> Pie:

conn = pymysql.connect(host='127.0.0.1', port=3306,\

user='root',password='', \

db='stockdb',charset='utf8', \

use_unicode=True)

sql = "select " \

"case is_hs WHEN 'H' then '沪股通' when 'S' then '深股通' ELSE '无' END as subject," \

"count(symbol) as value " \

"from tb_stock_info " \

"where exchange in ('SZSE','SSE') " \

"group by (case is_hs WHEN 'H' then '沪股通' when 'S' then '深股通' ELSE '无' END) " \

"order by count(symbol) desc"

df = pd.read_sql(sql, con=conn)

c = (

Pie()

.add("标的物数量", df.values)

.set_global_opts(title_opts=opts.TitleOpts(title="沪深股通标的物分布情况"))

.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))

)

conn.close()

return c

# 饼图渲染到Jupyter NoteBook中

stat_stock_subject().render_notebook()

代码执行如下图所示:

沪深股通标的物分布情况

3. 沪深股市上市年份分布情况

from pyecharts import options as opts

from pyecharts.charts import Pie

import pandas as pd

sql = "select '小于5年' as yearRange, sum(z.value) as stockNum from (" \

" select (TIMESTAMPDIFF(MONTH,str_to_date(list_date,'%Y%m%d'), CURRENT_DATE) / 12) as listYear, COUNT(symbol) as value" \

" from tb_stock_info" \

" where list_date is not null and list_status = 'L' and exchange in ('SZSE', 'SSE')" \

" group by (TIMESTAMPDIFF(MONTH,str_to_date(list_date,'%Y%m%d'), CURRENT_DATE) / 12) " \

" having listYear between 0 and 5" \

") z" \

" union " \

"select '5 - 10年' as yearRange, sum(a.value) as stockNum from (" \

" select (TIMESTAMPDIFF(MONTH,str_to_date(list_date,'%Y%m%d'), CURRENT_DATE) / 12) as listYear, COUNT(symbol) as value" \

" from tb_stock_info" \

" where list_date is not null and list_status = 'L' and exchange in ('SZSE', 'SSE')" \

" group by (TIMESTAMPDIFF(MONTH,str_to_date(list_date,'%Y%m%d'), CURRENT_DATE) / 12) " \

" having listYear between 5 and 10" \

") a" \

" union " \

"select '10 - 20年' as yearRange, sum(b.value) as stockNum from (" \

" select (TIMESTAMPDIFF(MONTH,str_to_date(list_date,'%Y%m%d'), CURRENT_DATE) / 12) as listYear, COUNT(symbol) as value" \

" from tb_stock_info" \

" where list_date is not null and list_status = 'L' and exchange in ('SZSE', 'SSE')" \

" group by (TIMESTAMPDIFF(MONTH,str_to_date(list_date,'%Y%m%d'), CURRENT_DATE) / 12) " \

" having listYear between 10 and 20" \

") b" \

" union " \

"select '大于20年' as yearRange, sum(c.value) as stockNum from (" \

" select (TIMESTAMPDIFF(MONTH,str_to_date(list_date,'%Y%m%d'), CURRENT_DATE) / 12) as listYear, COUNT(symbol) as value" \

" from tb_stock_info" \

" where list_date is not null and list_status = 'L' and exchange in ('SZSE', 'SSE')" \

" group by (TIMESTAMPDIFF(MONTH,str_to_date(list_date,'%Y%m%d'), CURRENT_DATE) / 12) " \

" having listYear > 20" \

") c"

# 生成饼图数据

def stat_stock_year(sql) -> Pie:

conn = pymysql.connect(host='127.0.0.1', port=3306,\

user='root',password='', \

db='stockdb',charset='utf8', \

use_unicode=True)

df = pd.read_sql(sql, con=conn)

c = (

Pie()

.add("股票数", df.values)

.set_global_opts(title_opts=opts.TitleOpts(title="沪深股市上市年份分布情况"))

.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))

)

conn.close()

return c

# 进行图渲染

stat_stock_year(sql).render_notebook()

代码执行如下图所示:

沪深股市上市年份分布情况

以上只是一些个人基础的实践, 目的是用于自己学习Python相关的数据采集与分析, 固有考虑不周的地方, 后期将会进一步的完善。

获取深户股市列表api_利用Tushare获取沪深股票数据与股票数据分析相关推荐

  1. python获取window共享目录列表_利用Python获取DICOM RTstructure勾画列表

    在<利用Python打开DICOM CT文件>一文中,我们利用pydicom.dcmread()读取了CT图像.本文中我们将修改load_scan()函数来读取RTstructure文件并 ...

  2. 利用Tushare获取金融数据

    利用Tushare获取金融数据 开发背景 Tushare社区 Tushare安装 Tushare使用 Tushare获取金融数据 1.获取A股列表 2.获取单只A股行情数据 3.获取多只A股数据 4. ...

  3. 利用tushare获取A股收盘价并画图

    利用tushare获取A股收盘价,画时间轴折线图 做量化研究,没有数据可谓是巧妇难为无米之炊,而tushare为我们提供了非常给力的国内金融数据api. 自从推出pro版本之后,该平台的表现更加稳定. ...

  4. 使用tushare检验沪深300收益率和中证500收益率相关性

    使用tushare检验沪深300收益率和中证50收益率相关性 tushare 安装tushare 初始化tushare 获取沪深300和中证500数据 检验相关性 合并数据 计算相关系数 画图 tus ...

  5. 量化策略初探——使用tushare进行沪深300ETF双均线策略

    使用tushare采集沪深300ETF数据,并对沪深300ETF采用简单移动平均.指数移动平均.进行双均线策略,最后使用backtrader进行回测. 一.基本概念 双均线策略:运用两条不同周期的移动 ...

  6. tushare获得沪深300和中证500的股票

    tushare获得沪深300和中证500的股票 import tushare as tsresult = ts.get_zz500s() result.to_csv("zz500.csv&q ...

  7. R语言 | 利用tushare获取股票k线、市值、换手率,市盈率等指标

    作者的tushare ID:456548 作者在股市进行比较短线的投资,想开发一些高效的指标作为买卖的参考,于是需要k线.市值.换手率等数据进行研究,同花顺等软件上面大多数据不能导出,所以找到了tus ...

  8. R语言 | 利用tushare获取股票数据实例

    作者的tushare ID:456548 自学深度学习模型,因为本人热爱在支付宝上买基金,于是突发奇想,用深度学习预测涨跌. 首要要获取基金的数据,但是基金数据不好获取,就获取对应的行业指数数据用于分 ...

  9. 利用tushare获取股票数据

    编写函数,实现从tushare获取任一股票的周收盘价,以及对相应股票收益率的修正.将任一股票2016-01-01至2018-03-31期间,周收益率低于-4%的股票修正为1%,并将原股票收盘价格以及修 ...

最新文章

  1. Web安全实践(9)攻击apache
  2. 大学计算机实验教程实验报告2.2,大学计算机实验2-实验报告.pdf
  3. linux知识记录20192022
  4. IntelliJ IDEA打开Maven项目,Spring boot所有依赖红名,不可用
  5. dubbo provider异步_dubbo九连问你知道多少?
  6. HBase MapReduce
  7. [react] 你最喜欢React的哪一个特性(说一个就好)
  8. 2014创新工场校招笔试题及参考答案
  9. python取模1e9+7_G题取1E9+7wa,取1E9+9等一些其他的值ac
  10. OOP的几个不常用的方法
  11. linux驱动编写(pwm驱动)
  12. height100%不能生效问题解决
  13. Docker第三方项目小结
  14. TVS管、稳压管、肖特基二极管
  15. 利用ffmpeg提取视频中的声音为MP3格式
  16. java初学者看什么书比较好
  17. 2016这一年读过的那些书
  18. 五子棋 java 棋盘变大_【java求助!】我的五子棋棋盘怎么加边框~!!??
  19. android 阅读器自动滚动,在Android手机上实现阅读器翻页效果.doc
  20. 通过singlefile把网页保存到本地

热门文章

  1. python的split()函数!
  2. M1卡修改各区块控制位值和数据
  3. 给初级beatles热爱者提供的歌曲MP3下载
  4. 信号一会有 一会显示无服务器,为什么有时手机信号差?原来是因为这些原因!...
  5. 【DP学习总结】区间DP
  6. c语言编程显示文件无效或损坏,【转】LNK1123: 转换到 COFF 期间失败: 文件无效或损坏...
  7. Advertising and public relations
  8. 中路由怎么配置_【国土语录 第64期】茶队点金大鱼后发生了什么;否定Fy关于茶队中路看法...
  9. 基于51单片机的倒计时温度检测报警器
  10. Android Studio常用快捷键