python获取股票数据,python 抓取股票数据

前言:

本人也是股票投资爱好着,这段时间行情不是很好,就想着做些其他事情转移下注意力,突然想起之前写过的小项目代码,运行后会对你想要的时间日期进行数据的分析生成,然后保存到本地,数据库之前我用的是tushare的,不过太久没用现在不知道数据的接口有没有改变,要想运行成功还是得要去他们那里搞个账号,具体我就不细节展开了。下面我放出代码,供各位大佬们参考,有能力的应该可以改成精美的图形html展示形式。

python获取股票数据,python 抓取股票数据

import os

import docx

import time

import warnings

import pandas as pd

import tushare as ts

from docx.shared import Cm, Inches

from docx.enum.text import WD_ALIGN_PARAGRAPH

from docx.shared import RGBColor,Pt

warnings.filterwarnings(‘ignore’)

#pd.set_option()就是pycharm输出控制显示的设置

pd.set_option(‘expand_frame_repr’, False)#True就是可以换行显示。设置成False的时候不允许换行

pd.set_option(‘display.max_columns’, None)# 显示所有列

#pd.set_option(‘display.max_rows’, None)# 显示所有行

pd.set_option(‘colheader_justify’, ‘centre’)# 显示居中

#os.chdir()用于改变当前工作目录到指定的路径

#此路径必须改为放数据的路径且中间的不能缺失任何一天数据,例如get_analysis_stockdata(‘20200101’, ‘20200106’),

#那么你放数据文件夹内不能缺少任何一个这段时期内的交易数据文件,否则报错

os.chdir(‘D:/stock_data/’) #保存的绝对路径,需要自己修改跟创建,就是切换默认的工作目录到你设置的路径

pro = ts.pro_api(‘要到tushare官网注册个账户然后将token复制到这里’)

#df_basic = pro.stock_basic() 获取基础信息数据,包括股票代码、名称、上市日期、退市日期等

#df_daily = pro.daily() 获取所有股票日行情信息,或通过通用行情接口获取数据,包含了前后复权数据,停牌期间不提供数据

#df_daily_basic = pro.daily_basic()获取全部股票每日重要的基本面指标,可用于选股分析、报表展示等。

def get_all_stockdata(st_date, ed_date):

trade_d = pro.trade_cal(exchange=’SSE’, is_open=’1′,start_date=st_date,end_date=ed_date,fields=’cal_date’)

for date in trade_d[‘cal_date’].values:

df_basic = pro.stock_basic(exchange=”, list_status=’L’) #再获取所有股票的基本信息

df_daily = pro.daily(trade_date=date) # 先获得所有股票的行情数据,成交额单位是千元,成交量是手

df_daily_basic = pro.daily_basic(ts_code=”, trade_date=date,fields=’ts_code, turnover_rate, turnover_rate_f,’

‘ volume_ratio, pe, pe_ttm, pb, ps, ps_ttm,’

‘ dv_ratio, dv_ttm, total_share, float_share,’

‘ free_share, total_mv, circ_mv ‘) #获取每日指标,单位是万股,万元

#基本数据跟行情数据合并,再跟每日指标数据合并生成一个csv数据文件

df_first = pd.merge(left=df_basic, right=df_daily, on=’ts_code’, how=’outer’) #on=’ts_code’以ts_code为索引,合并数据,how=’outer’,取并集

df_all = pd.merge(left=df_first, right=df_daily_basic, on=’ts_code’, how=’outer’)

#数据清洗,删除symbol列数据,跟ts_code数据重复

df_all = df_all.drop(‘symbol’, axis=1)

for w in [‘name’, ‘area’, ‘industry’, ‘market’]: #在’name’, ‘area’, ‘industry’, ‘market’列内循环填充NaN值

df_all[w].fillna(‘问题股’, inplace=True)

df_all[‘ts_code’] = df_all[‘ts_code’].astype(str) #强制转换成str字符串格式

df_all[‘list_date’] = pd.to_datetime(df_all[‘list_date’])

df_all[‘trade_date’] = pd.to_datetime(df_all[‘trade_date’])

df_all.to_csv(str(date) ‘_ts.csv’, index=False, encoding=’gbk’) #保存数据,不保存索引,如果index=True,则保存索引会多出一列

print(df_all)

print(‘%s is downloaded.’ % (str(date)))

return df_all

#分析数据并生成docx文档,存储至本地D盘D:/stock_analysis/

def get_analysis_stockdata(st_date, ed_date):

trade_d = pro.trade_cal(exchange=’SSE’, is_open=’1′,start_date=st_date,end_date=ed_date,fields=’cal_date’) #获取st_date,ed_date时间段内的交易日期

for date_now in trade_d[‘cal_date’].values: #将以上获取时间段的交易日期赋值给date_now

df = pd.read_csv(‘{}_ts.csv’.format(str(date_now)), encoding=’gbk’) #读取时间段内每日的股票数据

df.fillna(0, inplace=True) #fillna填充缺失数据,传入inplace=True直接修改原对象

#astype强制将涨幅,PE,总市值,流通市值转换成float格式,ts_code转化成str后,NAN也变成nan str格式

df[[‘change’, ‘pe’, ‘total_mv’, ‘circ_mv’]] = df[[‘change’, ‘pe’, ‘total_mv’, ‘circ_mv’]].astype(float)

df[‘list_date’] = pd.to_datetime(df[‘list_date’])

df[‘ts_code’] = df[‘ts_code’].astype(str)

# 添加交易所列

df.loc[df[‘ts_code’].str.startswith(‘3’), ‘exchange’] = ‘CY’

df.loc[df[‘ts_code’].str.startswith(‘6’), ‘exchange’] = ‘SH’

df.loc[df[‘ts_code’].str.startswith(‘0’), ‘exchange’] = ‘SZ’

df_up = df[df[‘change’] > 0.00] #找出上涨的股票

df_even = df[df[‘change’] == 0.00] #找出走平的股票

df_down = df[df[‘change’]

# 找出涨停的股票

limit_up = df[df[‘change’]/df[‘pre_close’] >= 0.097]

limit_down = df[df[‘change’]/df[‘pre_close’]

# 涨停股数中的未封板股,上市日期小于15天

limit_up_new = limit_up[pd.to_datetime(date_now) – limit_up[‘list_date’]

# 涨停股数中次新股,上市日期小于1年

limit_up_fresh = limit_up[pd.to_datetime(date_now) – limit_up[‘list_date’]

# 涨停股数中的未封板股,上市日期小于15天

limit_down_new = limit_down[pd.to_datetime(date_now) – limit_down[‘list_date’]

# 涨停股数中次新股,上市日期小于1年

limit_down_fresh = limit_down[pd.to_datetime(date_now) – limit_down[‘list_date’]

#df_up.shape[0]获取上涨的行数

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[‘vol’].sum()))

print(‘A股平均市盈率:%.2f, 平均流通市值 %.2f 亿, 平均总市值 %.2f 亿’ % (df[‘pe’].mean(), df[‘circ_mv’].mean(), df[‘total_mv’].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]))

file = docx.Document()

#设置总标题,居中

headb = file.add_heading(‘%s中国股市今日收盘分析报告’ % (date_now), level=0).alignment = WD_ALIGN_PARAGRAPH.CENTER

head1 = file.add_heading(‘股市基本概况:’,level=1) #设置一级标题

#添加段落内容

text1 = file.add_paragraph() #首先创建一个空的段落,然后再往里面加文字,这样方便设置文字格式字体等设置,另外一种写法,缺点不能单独设置字体属性

# text1 = file.add_paragraph(‘A股上涨个数: %d, A股下跌个数: %d, A股走平个数: %d。’ % (df_up.shape[0], df_down.shape[0], df_even.shape[0]))

text1.add_run(‘A股上涨个数:’).bold = True #添加文字并设置粗体

text1.add_run(‘{} ‘.format(str(df_up.shape[0]))).font.color.rgb = RGBColor(255, 0, 0) #添加变量

text1.add_run(‘A股下跌个数:’).bold = True

text1.add_run(‘{} ‘.format(str(df_down.shape[0]))).font.color.rgb = RGBColor(0, 255, 0)

text1.add_run(‘A股走平个数:’).bold = True

text1.add_run(‘{} ‘.format(str(df_even.shape[0]))).font.color.rgb = RGBColor(0, 0, 255)

text1.line_spacing = Pt(25) #设置段落行距

text1.style = ‘List Bullet’ # 设置项目符号列表

text2 = file.add_paragraph()

text2.add_run(‘A股总成交额:’).bold = True

text2.add_run(‘{}’.format(str(round(df[‘amount’].sum(),2)))).font.color.rgb = RGBColor(128, 0, 128)

text2.add_run(‘千元 ‘)

text2.add_run(‘总成交量:’).bold = True

text2.add_run(‘{}’.format(str(round(df[‘vol’].sum(),2)))).font.color.rgb = RGBColor(128, 0, 128)

text2.add_run(‘手 ‘)

text2.line_spacing = Pt(25)

text2.style = ‘List Bullet’

text3 = file.add_paragraph()

text3.add_run(‘A股平均市盈率:’).bold = True

text3.add_run(‘{} ‘.format(str(round(df[‘pe’].mean())))).font.color.rgb = RGBColor(128, 0, 128)

text3.add_run(‘平均流通市值:’).bold = True

text3.add_run(‘{}’.format(str(round(df[‘circ_mv’].mean(),2)))).font.color.rgb = RGBColor(128, 0, 128)

text3.add_run(‘万元’)

text3.add_run(‘n’)

text3.add_run(‘平均总市值:’).bold = True

text3.add_run(‘{}’.format(str(round(df[‘total_mv’].mean(),2)))).font.color.rgb = RGBColor(128, 0, 128)

text3.add_run(‘万元 ‘)

text3.line_spacing = Pt(25)

text3.style = ‘List Bullet’

text3.add_run(‘n’)

text4 = file.add_paragraph()

text4.add_run(‘涨停数量:’).bold = True

text4.add_run(‘{}’.format(str(limit_up.shape[0]))).font.color.rgb = RGBColor(255, 0, 0)

text4.add_run(‘个 ‘)

text4.add_run(‘涨停中上市日期小于15天的:’).bold = True

text4.add_run(‘{}’.format(str(limit_up_new.shape[0]))).font.color.rgb = RGBColor(255, 0, 0)

text4.add_run(‘个 ‘)

text4.add_run(‘n’)

text4.add_run(‘涨停中上市日期小于1年的:’).bold = True

text4.add_run(‘{}’.format(str(limit_up_fresh.shape[0]))).font.color.rgb = RGBColor(255, 0, 0)

text4.add_run(‘个 ‘)

text4.line_spacing = Pt(25)

text4.style = ‘List Bullet’

text5 = file.add_paragraph()

text5.add_run(‘跌停数量:’).bold = True

text5.add_run(‘{}’.format(str(limit_down.shape[0]))).font.color.rgb = RGBColor(0, 255, 0)

text5.add_run(‘个 ‘)

text5.add_run(‘跌停中上市日期小于15天的:’).bold = True

text5.add_run(‘{}’.format(str(limit_down_new.shape[0]))).font.color.rgb = RGBColor(0, 255, 0)

text5.add_run(‘个 ‘)

text5.add_run(‘n’)

text5.add_run(‘跌停中上市日期小于1年的:’).bold = True

text5.add_run(‘{}’.format(str(limit_down_fresh.shape[0]))).font.color.rgb = RGBColor(0, 255, 0)

text5.add_run(‘个 ‘)

text5.line_spacing = Pt(25)

text5.style = ‘List Bullet’

file.add_page_break() #添加分页符

def get_output(df, columns=’_industry’, name=’_limit_up’):

# df.copy(deep= False)和df.copy()都是浅拷贝,是复制了旧对象的内容,然后重新生成一个新对象,改变旧对象不会影响新对象。

df = df.copy()

output = pd.DataFrame()

#df.groupby(columns)根据列值分组数据,并根据股票代码统计数据

output = pd.DataFrame(df.groupby(columns)[‘ts_code’].count())

output[‘平均市盈率’] = round(df.groupby(columns)[‘pe’].mean(),2)

output[‘平均流通市值(万)’] = round(df.groupby(columns)[‘circ_mv’].mean(),2)

output[‘平均总市值(万)’] = round(df.groupby(columns)[‘total_mv’].mean(),2)

output[‘平均成交量(手)’] = round(df.groupby(columns)[‘vol’].mean(),2)

output[‘平均成交额(千)’] = round(df.groupby(columns)[‘amount’].mean(),2)

#依据ts_code进行降序,排序后的数据集替换原来的数据

output.sort_values(‘ts_code’, ascending=False, inplace=True)

#改列值名字,将ts_code改成name ‘_count’的形式

output.rename(columns={‘ts_code’: name ‘合计’}, inplace=True)

return output

for i in [‘industry’, ‘exchange’, ‘area’]:

# 对涨停的股票分析

output_limit_up = get_output(limit_up, columns=i, name=’涨停’).reset_index()

# 对跌停的股票分析

output_limit_down = get_output(limit_down, columns=i, name=’跌停’).reset_index()

# 对全量的股票分析

output_total = get_output(df, columns=i, name=’全部’).reset_index()

#添加表格开头类别说明

tabletext = file.add_paragraph()

tabletext.add_run(‘类别:’).bold = True

tabletext.add_run(‘{} ‘.format(str(i))).font.color.rgb = RGBColor(222, 125, 44)

print(output_limit_up)

print(output_limit_down)

print(output_total)

for j in [output_limit_up, output_limit_down, output_total]: #, output_total

tb = file.add_table(rows=len(j.index) 1, cols=len(j.columns),style=’Medium Grid 3 Accent 1′)

tb.autofit = True #关闭表格行宽自适应

for x in range(len(j.columns)):

tb.cell(0, x).text = j.columns[x] #添加表列头

#tb.cell(0, x).width = Inches(1.2) #设置行宽

tb.cell(0, x).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER #文字居中

for row in range(len(j.index)):

for col in range(len(j.columns)):

tb.cell(row 1, col).text = str(j.iloc[row, col]) #设置行宽

tb.cell(row 1, col).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER #文字居中

file.add_paragraph(‘n’) #表格换行

file.add_page_break() #每制成一个类别表格分一次页面

#之所以生成文件慢是因为output_total这个统计需要长时间计算,如果需要速度快你可以试着把output_total去掉

#生成一个docx文件我的电脑需要3到4分钟左右

file.save(‘D:stock_analysis{}_分析报告.docx’.format(str(date_now)))

print(‘{}_分析报告分析完成’.format(str(date_now)))

if __name__==”__main__”:

get_all_stockdata(‘20200611’, ‘20200611’)

get_analysis_stockdata(‘20200611’, ‘20200611’)

python获取股票数据,python 抓取股票数据

python获取股票数据,python 抓取股票数据

python获取股票数据,python 抓取股票数据

如何利用python进行数据分析

近年来分析学在数据、网络、金融等领域获得了突出的地位。应用各种软件组合起来进行数据收集,数据管理,以及数据分析,得出的结论用作商业决策,业务需求分析等等。分析学用于研究一个产品的市场效应,银行的贷款决定,这些都只是分析学的冰山一角。它在大数据,安全,数字和软件分析等领域有很深远的影响,下面是Python在分析学中的主要作用的一个延续:
在这个信息过载的世界,只有那些可以利用解析数据的优势来得出见解的人会获益。Python对于大数据的解释和分析具有很重要的作用。分析公司开发的很多工具都是基于Python来约束大数据块。分析师们会发现Python并不难学,它是一个强有力的数据管理和业务支持的媒介。
使用单一的语言来处理数据有它的好处。如果你以前曾经使用过C++或者Java,那么对你来说,Python应该很简单。数据分析可以使用Python实现,有足够的Python库来支持数据分析。 Pandas是一个很好的数据分析工具,因为它的工具和结构很容易被用户掌握。对于大数据来说它无疑是一个最合适的选择。即使是在数据科学领域,Python也因为它的“开发人员友好性”而使其他语言相形见绌。一个数据科学家熟悉Python的可能性要比熟悉其他语言的可能性高得多。
除了Python在数据分析中那些很明显的优点(易学,大量的在线社区等等)之外,在数据科学中的广泛使用,以及我们今天看到的大多数基于网络的分析,是Python在数据分析领域得以广泛传播的主要原因。
不论是金融衍生品还时大数据分析,Python都发挥了重要的作用。就前者而言,Python能够很好地和其它系统,软件工具以及数据流结合在一起,当然也包括R。用Python来对大数据做图表效果更好,它在速度和帮助方面也一样可靠。有些公司使用Python进行预测分析和统计分析。

python获取股票数据,python 抓取股票数据

如何用Python进行大数据挖掘和分析?

如何用Python进行大数据挖掘和分析?快速入门路径图
大数据无处不在。在时下这个年代,不管你喜欢与否,在运营一个成功的商业的过程中都有可能会遇到它。
什么是 大数据 ?
大数据就像它看起来那样——有大量的数据。单独而言,你能从单一的数据获取的洞见穷其有限。但是结合复杂数学模型以及强大计算能力的TB级数据,却能创造出人类无法制造的洞见。大数据分析提供给商业的价值是无形的,并且每天都在超越人类的能力。
大数据分析的第一步就是要收集数据本身,也就是众所周知的“数据挖掘”。大部分的企业处理着GB级的数据,这些数据有用户数据、产品数据和地理位置数据。今天,我将会带着大家一起探索如何用 Python 进行大数据挖掘和分析?
为什么选择Python?
Python最大的优点就是简单易用。这个语言有着直观的语法并且还是个强大的多用途语言。这一点在大数据分析环境中很重要,并且许多企业内部已经在使用Python了,比如Google,YouTube,迪士尼等。还有,Python是开源的,并且有很多用于数据科学的类库。
现在,如果你真的要用Python进行大数据分析的话,毫无疑问你需要了解Python的语法,理解正则表达式,知道什么是元组、字符串、字典、字典推导式、列表和列表推导式——这只是开始。
数据分析流程
一般可以按“数据获取-数据存储与提取-数据预处理-数据建模与分析-数据可视化”这样的步骤来实施一个数据分析项目。按照这个流程,每个部分需要掌握的细分知识点如下:
数据获取:公开数据、Python爬虫
外部数据的获取方式主要有以下两种。
第一种是获取外部的公开数据集,一些科研机构、企业、政府会开放一些数据,你需要到特定的网站去下载这些数据。这些数据集通常比较完善、质量相对较高。
另一种获取外部数据的方式就是爬虫。
比如你可以通过爬虫获取招聘网站某一职位的招聘信息,爬取租房网站上某城市的租房信息,爬取豆瓣评分评分最高的电影列表,获取知乎点赞排行、网易云音乐评论排行列表。基于互联网爬取的数据,你可以对某个行业、某种人群进行分析。
在爬虫之前你需要先了解一些 Python 的基础知识:元素(列表、字典、元组等)、变量、循环、函数………
以及,如何用 Python 库(urllib、BeautifulSoup、requests、scrapy)实现网页爬虫。
掌握基础的爬虫之后,你还需要一些高级技巧,比如正则表达式、使用cookie信息、模拟用户登录、抓包分析、搭建代理池等等,来应对不同网站的反爬虫限制。
数据存取:SQL语言
在应对万以内的数据的时候,Excel对于一般的分析没有问题,一旦数据量大,就会力不从心,数据库就能够很好地解决这个问题。而且大多数的企业,都会以SQL的形式来存储数据。
SQL作为最经典的数据库工具,为海量数据的存储与管理提供可能,并且使数据的提取的效率大大提升。你需要掌握以下技能:
提取特定情况下的数据
数据库的增、删、查、改
数据的分组聚合、如何建立多个表之间的联系
数据预处理:Python(pandas)
很多时候我们拿到的数据是不干净的,数据的重复、缺失、异常值等等,这时候就需要进行数据的清洗,把这些影响分析的数据处理好,才能获得更加精确地分析结果。
对于数据预处理,学会 pandas (Python包)的用法,应对一般的数据清洗就完全没问题了。需要掌握的知识点如下:
选择:数据访问
缺失值处理:对缺失数据行进行删除或填充
重复值处理:重复值的判断与删除
异常值处理:清除不必要的空格和极端、异常数据
相关操作:描述性统计、Apply、直方图等
合并:符合各种逻辑关系的合并操作
分组:数据划分、分别执行函数、数据重组
Reshaping:快速生成数据透视表
概率论及统计学知识
需要掌握的知识点如下:
基本统计量:均值、中位数、众数、百分位数、极值等
其他描述性统计量:偏度、方差、标准差、显著性等
其他统计知识:总体和样本、参数和统计量、ErrorBar
概率分布与假设检验:各种分布、假设检验流程
其他概率论知识:条件概率、贝叶斯等
有了统计学的基本知识,你就可以用这些统计量做基本的分析了。你可以使用 Seaborn、matplotlib 等(python包)做一些可视化的分析,通过各种可视化统计图,并得出具有指导意义的结果。
Python 数据分析
掌握回归分析的方法,通过线性回归和逻辑回归,其实你就可以对大多数的数据进行回归分析,并得出相对精确地结论。这部分需要掌握的知识点如下:
回归分析:线性回归、逻辑回归
基本的分类算法:决策树、随机森林……
基本的聚类算法:k-means……
特征工程基础:如何用特征选择优化模型
调参方法:如何调节参数优化模型
Python 数据分析包:scipy、numpy、scikit-learn等
在数据分析的这个阶段,重点了解回归分析的方法,大多数的问题可以得以解决,利用描述性的统计分析和回归分析,你完全可以得到一个不错的分析结论。
当然,随着你实践量的增多,可能会遇到一些复杂的问题,你就可能需要去了解一些更高级的算法:分类、聚类。
然后你会知道面对不同类型的问题的时候更适合用哪种算法模型,对于模型的优化,你需要去了解如何通过特征提取、参数调节来提升预测的精度。
你可以通过 Python 中的 scikit-learn 库来实现数据分析、数据挖掘建模和分析的全过程。
总结
其实做数据挖掘不是梦,5步就能让你成为一个Python爬虫高手!

未经允许不得转载:股市行情网 » python获取股票数据,python 抓取股票数据

相关文章

评论 (0)