基于Python获取股票分析,数据分析实战

简介:   1. Tushare简介1.1. 开源、免费版Tushare  Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。考虑到Python pandas包在金融量化分析中体现出的优势,Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,非常便于用pandas/NumPy/Matplotlib进行数据分析和可视化。当然,如果您习惯了用Excel或者关系型数

  1. Tushare简介1.1. 开源、免费版Tushare

  Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。考虑到Python pandas包在金融量化分析中体现出的优势,Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,非常便于用pandas/NumPy/Matplotlib进行数据分析和可视化。当然,如果您习惯了用Excel或者关系型数据库做分析,您也可以通过Tushare的数据存储功能,将数据全部保存到本地后进行分析。

  私信小编01即可获取大量Python学习资料

  地址:tushare/

  1.2. 注册升级版 Tushare pro

  Pro版数据更稳定质量更好了,但Pro依然是个开放的,免费的平台,不带任何商业性质和目的。

  1.3. 获取Tushare

  不管你是量化投资分析师,还是正在学习Python进行数据分析的学习者,这种方法获取的数据都可以适用。

  获取前的准备:

  pip install tushare2. 获取数据

  我为了更方便的使用Tushare接口API,也为了兼容新、旧版本,设计类整合新版本。

  2.1. 获取历史行情数据

  #获取历史日线数据

  def get_his_dat(self,start_date,end_date):

  #新pro接口,可以多个股票

  if self:

  self.his_dat=self.stock.daily(ts_code=self.code, start_date=start_date, end_date=end_date)

  else:

  #旧接口,不用注册

  self.his_dat=ts.get_hist_data(code=self.code,start=start_date, end=end_date)

  #把索引赋值给trade_date

  #self.his_dat['trade_date']=self.his_dat.index

  self.his_dat=self.his_dat.reset_index()

  self.setCodebyOld()

  self.his_dat['ts_code']=self.code

  #参照pro接口,修改列名

  self.his_dat=self.his_datame(columns={

  'date':'trade_date','volume':'vol','price_change':'change','p_change':'pct_chg'})

  #筛选列

  self.his_dat=self.his_dat[self.columns] #.reset_index()

  return self.his_dat

  本接口只能获取近3年的日线数据,适合搭配均线数据进行选股和分析。

  输入参数说明:

  |股票代码|开始日期|结束日期|数据类型|

  老版本关键字

  新版本关键字(pro)

  说明

  code

  ts_code

  股票代码

  trade_date

  交易日期

  start

  start_date

  开始日期,格式YYYY-MM-DD/新版本YYYYMMDD

  end

  end_date

  结束日期,格式YYYY-MM-DD/新版本YYYYMMDD

  ktype

  数据类型

  retry_count

  当网络异常后重试次数,默认为3

  pause

  重试时停顿秒数,默认为0

  老版本中:

  1.股票代码,即6位数字代码,或者指数代码(sh=上证指数 sz=深圳成指 hs300=沪深300指数 sz50=上证50 zxb=中小板 cyb=创业板)

  2.数据类型,D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 60=60分钟,默认为D

  返回值说明:

  老版本关键字

  新版本关键字(pro)

  说明

  ts_code

  股票代码

  date

  trade_date

  交易日期

  open

  open

  开盘价

  high

  high

  最高价

  close

  close

  收盘价

  pre_close

  昨收盘价

  low

  low

  最低价

  volume

  vol

  成交量

  price_change

  change

  价格变动、涨跌额

  p_change

  pct_chg

  涨跌幅

  ma5

  5日均价

  ma10

  10日均价

  ma20

  20日均价

  v_ma5

  5日均量

  v_ma10

  10日均量

  v_ma20

  20日均量

  turnover

  换手率[注:指数无此项]

  amount

  成交额

  老版本中date为index,不是具体column。

  2.2. 获取历史行情数据——指数

  上证指数、深圳成指、沪深300指数、上证50 、中小板、创业板等。

  上证指数代码为“000001.SH”,老版本代码为“sh”;二手手游账号拍卖深成指数代码为“399001.SZ”,老版本为“399001”或“sz”。

  #获取沪深指数

  def get_hs_index(self,start_date,end_date):

  if self:

  self.hs_index=ts_bar(ts_code=self.code, asset='I', start_date=start_date, end_date=end_date)

  else:

  #旧接口,不用注册

  index_code={

  '000001.SH':'sh','399001.SZ':'399001','000300.SH':'000016.SH','sz50':'sz50','399005.SZ':'zxb','399006.SZ':'cyb'}

  self.his_dat=ts.get_hist_data(code=index_code[self.code],start=start_date, end=end_date)

  #把索引赋值给trade_date

  #self.his_dat['trade_date']=self.his_dat.index

  self.his_dat=self.his_dat.reset_index()

  self.his_dat['ts_code']=self.code

  #参照pro接口,修改列名

  self.his_dat=self.his_datame(columns={

  'date':'trade_date','volume':'vol','price_change':'change','p_change':'pct_chg'})

  #筛选列

  self.his_dat=self.his_dat[self.columns] #.reset_index()

  return self.hs_index2.3. 获取历史行情数据——情绪指数

  目前pro版本国外已经支持如下指数数据(数据来源:tushare/):

  TS指数代码

  指数名称

  XIN9

  富时中国A50指数 (富时A50)

  HSI

  恒生指数

  DJI

  道琼斯工业指数

  SPX

  标普500指数

  IXIC

  纳斯达克指数

  FTSE

  富时100指数

  FCHI

  法国CAC40指数

  GDAXI

  德国DAX指数

  N225

  日经225指数

  KS11

  韩国综合指数

  AS51

  澳大利亚标普200指数

  SENSEX

  印度孟买SENSEX指数

  IBOVESPA

  巴西IBOVESPA指数

  RTS

  俄罗斯RTS指数

  TWII

  台湾加权指数

  CKLSE

  马来西亚指数

  SPTSX

  加拿大S&P/TSX指数

  CSX5P

  STOXX欧洲50指数

  使用方法:

  #美股指数

  def get_us_index(self,start_date,end_date):

  if self:

  self.us_index=self.stock.index_global(ts_code=self.us_code, start_date=start_date, end_date=end_date)

  self.us_index=self.us_index[self.columns]

  return self.us_index2.4. 获取分时数据

  升级pro版本,可以获取3年的数据,而老版本 只能获取1个月的分时数据。

  #获取分钟级别数据

  def get_tickshare_dat(self,freq,start_date, end_date):

  if self:

  start_date=re.sub('\D','',start_date)

  end_date=re.sub('\D','',end_date)

  freq=freq + 'min'

  self.tickshare_dat=ts_bar(ts_code=self.code, freq=freq,start_date=start_date, end_date=end_date)

  self.tickshare_dat['vol']=self.tickshare_dat['vol'] /100

  else:

  # ktype:数据类型,D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 60=60分钟,默认为D

  self.tickshare_dat=ts.get_hist_data(code=self.code, ktype=freq,start=start_date, end=end_date)

  self.tickshare_dat['ts_code']=self.code

  self.tickshare_dat=self.tickshare_dat.reset_index()

  self.tickshare_dat=self.tickshare_datame(columns={

  'date':'trade_time','volume':'vol'})

  self.tickshare_dat['trade_date']=self.tickshare_dat['trade_time'].apply(lambda x:re.sub('\D','',x[0:10]))

  self.setCodebyOld()

  self.tickshare_dat['ts_code']=self.code

  self.tickshare_dat=self.tickshare_dat[['ts_code','trade_time','open','high','close','low','vol','trade_date']]

  return self.tickshare_dat

  注:输入freq为字符型数字,1/5/15/30/60

  2.5. 获取股票基本信息

  #获取股票基本面信息

  def get_ShareInfo(self,trade_date):

  if self:

  self.shareInfo=self.stock.daily_basic(ts_code=self.code, trade_date=trade_date) #, fields='ts_code,trade_date,turnover_rate,volume_ratio,pe,pb')

  else:

  self.shareInfo=ts.get_stock_basics()

  print(self.shareInfo)

  2.6. 获取复权数据

  # 获取复权数据

  def get_h_dat(self,start_date,end_date,fq='hfq'):

  #self.h_dat=ts.get_h_data(code=self.code, autype='hfq',start=start_date, end=end_date)

  self.h_dat=ts_bar(ts_code=self.code, adj=fq, start_date=start_date, end_date=end_date)

  return self.h_dat

  3. 数据存储在本地Mongo数据库中

  class Stock_Collection(object):

  def __init__(self,db_name):

  self.db_name=db_name

  client=pymongo.MongoClient('mongodb://stock:stock@localhost:27017/stock')

  self.db=client[self.db_name]

  def insertdatas(self,name,datas):

  collection=self.db[name]

  collection.insert(json.loads(datas.T.to_json()).values())

  def getDistinctCode(self,name):

  collection=self.db[name]

  code=collection.distinct('ts_code')

  return code

  def setIndex_Code(self):

  self.sentiment_index=['IXIC','DJI','HSI'] # 情绪指数

  self.sentiment_index_column=['trade_date','open','high','close','low','change','pct_chg']

  self.index_daily=['000001.SH', '399001.SZ']

  self.index_daily_column=['trade_date','open','high','close','low','vol','change','pct_chg']

  def setCode(self,code):

  self.code=code #['002230.SZ'] #, '000547.SZ', '601318.SH', '601208.SH', '600030.SH', '000938.SZ', '002108.SZ', '600967.SH']

  self.stock_column=['trade_date','open','high','close','low','vol','change','pct_chg']

  # 构造LSTM模型训练集

  def generate_train_datas(self,db_name,code_name,filename):

  collection=self.db[db_name]

  self.out_code=code_name

  #查询条件“字典”

  query_dict={

  'ts_code':'1','trade_date':{

  '$gt':'20211001'}}

  #col_name={'_id':0,'trade_date':1,'ts_code':1,'open':1,'high':1,'close':1,'low':1,'vol':1,'change':1,'pct_chg':1}

  col_name={

  '_id':0}

  for d in self.stock_column:

  col_name[d]=1

  query_dict['ts_code']=self.out_code

  #注意时间排序

  df=pd.DataFrame(list(collection.find(query_dict,col_name).sort([('trade_date',1)])))

  df['trade_date']=df['trade_date'].apply(lambda x:re.sub('\D','',x)) #去掉日期中的“-”符号

  self.code.remove(self.out_code) # 删除输出股票代码

  #构造股票数据集

  n=0

  k=0

  columns=self.stock_column.copy()

  columns.remove('trade_date')

  print('Start!')

  #self.code长度为1,下面循环不执行

  for code in self.code:

  query_dict['ts_code']=code

  df1=pd.DataFrame(list(collection.find(query_dict,col_name).sort([('trade_date',1)])))

  df1['trade_date']=df1['trade_date'].apply(lambda x:re.sub('\D','',x)) #去掉日期中的“-”符号

  #按日期合并两个表

  #df=pd.merge(left=df,right=df1,how='left',on=['trade_date'])

  #以上证为基准

  df=pd.merge(left=df,right=df1,how='inner',on=['trade_date'])

  # 处理合并表,字段重复的情况,需要把_x,_y新命名字段,下轮继续

  cols_dict={

  }

  for cols in columns:

  cols_dict[cols+'_x']=cols + str(n)

  cols_dict[cols+'_y']=cols + str(n+1)

  if k==0:

  df=dfame(columns=cols_dict)

  n=n + 2

  k=1

  else:

  k=0

  print('code 1')

  print(df)

  #构造数据集——上证、深成指数

  query_dict={

  'ts_code':'1'}

  columns=self.index_daily_column.copy() #默认list为传址,需要赋值新list

  columns.remove('trade_date')

  print(self.index_daily_column)

  for index_daily in self.index_daily:

  query_dict['ts_code']=index_daily

  col_name={

  '_id':0}

  for d in self.index_daily_column:

  col_name[d]=1

  df1=pd.DataFrame(list(collection.find(query_dict,col_name).sort([('trade_date',1)])))

  df1['trade_date']=df1['trade_date'].apply(lambda x:re.sub('\D','',x)) #去掉日期中的“-”符号

  #按日期合并两个表

  df=pd.merge(left=df,right=df1,how='left',on=['trade_date'])

  cols_dict={

  }

  for cols in columns:

  cols_dict[cols+'_x']=cols + str(n)

  cols_dict[cols+'_y']=cols + str(n+1)

  if k==0:

  df=dfame(columns=cols_dict)

  n=n + 2

  k=1

  else:

  k=0

  print(df)

  #构造数据集——情绪指数

  columns=self.sentiment_index_column.copy()

  columns.remove('trade_date')

  for sentiment_index in self.sentiment_index:

  query_dict['ts_code']=sentiment_index

  col_name={

  '_id':0}

  for d in self.sentiment_index_column:

  col_name[d]=1

  df1=pd.DataFrame(list(collection.find(query_dict,col_name).sort([('trade_date',1)])))

  df1['trade_date']=df1['trade_date'].apply(lambda x:re.sub('\D','',x)) #去掉日期中的“-”符号

  #按日期合并两个表

  df=pd.merge(left=df,right=df1,how='left',on=['trade_date'])

  cols_dict={

  }

  for cols in columns:

  cols_dict[cols+'_x']=cols + str(n)

  cols_dict[cols+'_y']=cols + str(n+1)

  df=dfame(columns=cols_dict)

  if k==0:

  df=dfame(columns=cols_dict)

  n=n + 2

  k=1

  else:

  k=0

  print(df)

  df=df.fillna(0) #数据缺失补上为0,相当于停盘!!!

  df.to_csv(filename)

目录
相关文章
|
25天前
|
缓存 Rust 算法
从混沌到秩序:Python的依赖管理工具分析
Python 的依赖管理工具一直没有标准化,主要原因包括历史发展的随意性、社区的分散性、多样化的使用场景、向后兼容性的挑战、缺乏统一治理以及生态系统的快速变化。依赖管理工具用于处理项目中的依赖关系,确保不同环境下的依赖项一致性,避免软件故障和兼容性问题。常用的 Python 依赖管理工具如 pip、venv、pip-tools、Pipenv、Poetry 等各有优缺点,选择时需根据项目需求权衡。新工具如 uv 和 Pixi 在性能和功能上有所改进,值得考虑。
83 35
|
1月前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
在现代数据分析中,高维时间序列数据的处理和预测极具挑战性。基于矩阵分解的长期事件(MFLEs)分析技术应运而生,通过降维和时间序列特性结合,有效应对大规模数据。MFLE利用矩阵分解提取潜在特征,降低计算复杂度,过滤噪声,并发现主要模式。相比传统方法如ARIMA和深度学习模型如LSTM,MFLE在多变量处理、计算效率和可解释性上更具优势。通过合理应用MFLE,可在物联网、金融等领域获得良好分析效果。
62 0
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
|
27天前
|
数据采集 数据可视化 数据挖掘
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
本文探讨了金融资产波动率建模中的三种主流方法:GARCH、GJR-GARCH和HAR模型,基于SPY的实际交易数据进行实证分析。GARCH模型捕捉波动率聚类特征,GJR-GARCH引入杠杆效应,HAR整合多时间尺度波动率信息。通过Python实现模型估计与性能比较,展示了各模型在风险管理、衍生品定价等领域的应用优势。
238 66
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
|
1月前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
104 61
Python装饰器实战:打造高效性能计时工具
|
17天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
90 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
1月前
|
数据可视化 算法 数据挖掘
Python时间序列分析工具Aeon使用指南
**Aeon** 是一个遵循 scikit-learn API 风格的开源 Python 库,专注于时间序列处理。它提供了分类、回归、聚类、预测建模和数据预处理等功能模块,支持多种算法和自定义距离度量。Aeon 活跃开发并持续更新至2024年,与 pandas 1.4.0 版本兼容,内置可视化工具,适合数据探索和基础分析任务。尽管在高级功能和性能优化方面有提升空间,但其简洁的 API 和完整的基础功能使其成为时间序列分析的有效工具。
79 37
Python时间序列分析工具Aeon使用指南
|
1月前
|
机器学习/深度学习 运维 数据可视化
Python时间序列分析:使用TSFresh进行自动化特征提取
TSFresh 是一个专门用于时间序列数据特征自动提取的框架,支持分类、回归和异常检测等机器学习任务。它通过自动化特征工程流程,处理数百个统计特征(如均值、方差、自相关性等),并通过假设检验筛选显著特征,提升分析效率。TSFresh 支持单变量和多变量时间序列数据,能够与 scikit-learn 等库无缝集成,适用于大规模时间序列数据的特征提取与模型训练。其工作流程包括数据格式转换、特征提取和选择,并提供可视化工具帮助理解特征分布及与目标变量的关系。
70 16
Python时间序列分析:使用TSFresh进行自动化特征提取
|
2天前
|
存储 数据采集 数据库
Python爬虫实战:股票分时数据抓取与存储
Python爬虫实战:股票分时数据抓取与存储
|
27天前
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
54 20
|
30天前
|
数据采集 缓存 API
python爬取Boss直聘,分析北京招聘市场
本文介绍了如何使用Python爬虫技术从Boss直聘平台上获取深圳地区的招聘数据,并进行数据分析,以帮助求职者更好地了解市场动态和职位需求。

热门文章

最新文章