使用tushare获取股票数据并计算历史概念板块的平均涨跌幅

目录

概述

前提准备

编码

 


 

 


概述

有些板块的涨跌可能会有周期性,比如某个时间段某个板块大概率会上涨,为了研究这个内容,我们需要去查询某段时间间隔的板块平均涨跌幅,这里我单独计算涨幅和跌幅。

但是这个数据不能通过行情软件查询,所以可以使用tushare提供的数据接口进行处理。

备注:因为权限问题,所以调用这个封装接口后,调用需要花费的时间很多,需要暂停一分钟调用五个板块的数据。

同时笔者并不擅长使用python,所以代码会写得很简单,同时有详细的注解,方便大家参考,感谢支持。

前提准备

需要去https://waditu.com/注册账号,申请专用的appkey,才能进行调用哦,

这里主要调用了两个接口

同花顺板块指数:用来获取板块指数代码

同花顺板块指数行情:通过上面的指数代码获取板块数据。

编码

首先导入模块

 

import tushare as ts #导入模块
from flask import Flask,render_template,request #导入模块
import time
import json

ts.set_token('你的key')
pro = ts.pro_api()

然后这里调用同花顺板块指数接口,获取板块代码和名称封装到字典中

#板块列表
block_list = pro.ths_index()

#概念板块列表
block_list_code={} #key:代码 val:板块名称
#最终数据
list_obj = []

#获取行
for i in range(0,len(block_list)):
    if block_list.loc[i,'exchange']=='A':#查询A股
        block_list_code[block_list.loc[i,'ts_code']]=block_list.loc[i,'name']

dic_keys = list(block_list_code.keys()) #板块代码
dic_vals = list(block_list_code.values()) #板块名称

 

然后用上面的数据获取数据,同时处理计算平均涨跌幅

#权限限制,每分钟查询五个板块的涨跌信息
for i in range(0,len(block_list_code)):
    up_sum = 0 #单个板块的总涨幅
    down_sum = 0 #单个板块的总跌幅
    up_ave = 0 #单个板块的平均涨幅
    down_ave = 0 #单个板块的平均跌幅
    count = 0 #涨的个数
    #查询板块行情
    df_daily = pro.ths_daily(ts_code=dic_keys[i], start_date=start_date, end_date=end_date, fields='ts_code,trade_date,open,close,high,low,pct_change')
    #求平均涨幅和跌幅
    for x in range(0,len(df_daily)):
        #判断有涨跌幅,不然会出错,None和Int不能运算
        if df_daily.loc[x,'pct_change'] != None:
            if df_daily.loc[x,'pct_change']>0:#上涨
                up_sum += df_daily.loc[x,'pct_change'] #累加涨幅
                count += 1
            else:
                down_sum += df_daily.loc[x,'pct_change']#累加跌幅
    #求平均涨幅
    if count==0:
        up_ave=0
    else:
        up_ave = round(up_sum/count,4) 
    #求平均跌幅
    if (len(df_daily)-count)==0:
        down_ave=0
    else:
        down_ave = round(down_sum/(len(df_daily)-count),4) 
    
    #为了省事用字典代替对象保存我们需要的数据
    obj_dic = {'name':dic_vals[i],'code':dic_keys[i],'up_ave':str(up_ave)+"%",'down_ave':str(down_ave)+"%"}
    list_obj.append(obj_dic)

    #取模暂停
    if (i+1)%5 == 0:
        time.sleep(62) #暂停62秒
#根据涨幅排序
list_obj2 = sorted(list_obj,key = lambda e:e.__getitem__('up_ave'),reverse=True)

最后我是封装到了flask中,然后可以查询一下2019-2-11到2019-2-28日,也就是2019年春节过后哪些板块涨得比较好。

@app.route("/get_plate_ave",methods = ["GET"]) 
def get_plate_ave():
    start_date = request.args.get("start_date")
    end_date = request.args.get("end_date")
   
    #板块列表
    block_list = pro.ths_index()

    #概念板块列表
    block_list_code={} #key:代码 val:板块名称
    #最终数据
    list_obj = []

    #获取行
    for i in range(0,len(block_list)):
        if block_list.loc[i,'exchange']=='A':#查询A股
            block_list_code[block_list.loc[i,'ts_code']]=block_list.loc[i,'name']

    dic_keys = list(block_list_code.keys()) #板块代码
    dic_vals = list(block_list_code.values()) #板块名称

    #权限限制,每分钟查询五个板块的涨跌信息
    for i in range(0,len(block_list_code)):
        up_sum = 0 #单个板块的总涨幅
        down_sum = 0 #单个板块的总跌幅
        up_ave = 0 #单个板块的平均涨幅
        down_ave = 0 #单个板块的平均跌幅
        count = 0 #涨的个数
        #查询板块行情
        df_daily = pro.ths_daily(ts_code=dic_keys[i], start_date=start_date, end_date=end_date, fields='ts_code,trade_date,open,close,high,low,pct_change')
        
        #求平均涨幅和跌幅
        for x in range(0,len(df_daily)):
            #判断有涨跌幅,不然会出错,None和Int不能运算
            if df_daily.loc[x,'pct_change'] != None:
                if df_daily.loc[x,'pct_change']>0:#上涨
                    up_sum += df_daily.loc[x,'pct_change'] #累加涨幅
                    count += 1
                else:
                    down_sum += df_daily.loc[x,'pct_change']#累加跌幅
        #求平均涨幅
        if count==0:
            up_ave=0
        else:
            up_ave = round(up_sum/count,4) 
        #求平均跌幅
        if (len(df_daily)-count)==0:
            down_ave=0
        else:
            down_ave = round(down_sum/(len(df_daily)-count),4) 
        
        #为了省事用字典代替对象保存我们需要的数据
        obj_dic = {'name':dic_vals[i],'code':dic_keys[i],'up_ave':str(up_ave)+"%",'down_ave':str(down_ave)+"%"}
        list_obj.append(obj_dic)

        #取模暂停
        if (i+1)%5 == 0:
            time.sleep(62) #暂停62秒
    #根据涨幅排序
    list_obj2 = sorted(list_obj,key = lambda e:e.__getitem__('up_ave'),reverse=True)
    return json.dumps(list_obj2,ensure_ascii=False)

 

 

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值