python利用tushare下载数据并计算当日收益率

2023-11-20

python利用tushare下载数据并计算当日收益率

计算股票收益率的程序主要有以下几部分构成:
1、获取股票接口数据函数:pro_daily_stock()
2、计算收益率函数:cal_stock(),里面有两种计算式,
你可以根据自己字典写入建仓价格做差计算,也可以像我一样用收盘价-当天开盘价计算
3、可视化函数:画柱状图def draw_bar_stock()
4、最后对象实例化,调用函数
里面有一个嵌套字典需要你手动填写的stock_sum={}
只填写股票代码和股票名称就够了,也可以填写你的买入价格。
以今天炒股机构给我推荐的10支股票为示例,
效果如下:
在这里插入图片描述

代码如下:

#! /usr/bin/env python
#-*- encoding: utf-8 -*-

"""
作者:廖超铭-量化交易员
仅用于教学目的,严禁转发和用于盈利目的,违者必究,若要引用,请注明出处
日期:2021-7-19
功能:股票收益可视化
"""
#导入模块
import matplotlib.pyplot as plt
import pandas as pd
import tushare as ts

#############参数
pd.set_option('display.expand_frame_repr',False)#False不允许换行
pd.set_option('display.max_rows', 10)#显示的最大行数
pd.set_option('display.max_columns', 6)#显示的最大列数
pd.set_option('precision', 1)#显示小数点后的位数
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

##############函数部分
#一个获取股票价格的函数
def pro_daily_stock(code_val  ,start_val ,end_val):
    # 获取股票日线行情数据
    token = 'c3d13a70203e52cb7479f32953928b21680f94c255ff09aed868c4c4'
    pro = ts.pro_api(token)
    df_stock = pro.daily(ts_code=code_val,adj='qfq', start_date=start_val, end_date=end_val)#其中adj 是设置复权的接口,none:不复权  qfq:前复权  hfq:后复权
    df_stock.trade_date = pd.DatetimeIndex(df_stock.trade_date)
    df_stock.set_index("trade_date", drop=True, inplace=True)
    df_stock.sort_index(inplace=True)
    df_stock.index = df_stock.index.set_names('Date')

    recon_data = {'High': df_stock.high, 'Low': df_stock.low, 'Open': df_stock.open, 'Close': df_stock.close,\
                  'Volume': df_stock.vol}
    df_recon = pd.DataFrame(recon_data)

    return df_recon
# 定义一个函数用来计算收益率
def cal_stock(dict,starttime,endtime):
    #######获取字典数据部分
    name_stock = []
    code_stock =[]
    start_value =[]

    value = []
    for key in  dict:#最后应该组成一个表格,最后生成两个列表,index为股票名称,value为收益率
        n = 0
        for key2 in dict[key]:
            if n ==0:#此时是打印的是股票代码,为了后面检索下载股票收盘数据用
                code_stock.append(dict[key][key2])
            if n ==1:#此时打印的是股票名称,用于画图的很横坐标,组合成列表
                name_stock.append(dict[key][key2])

            if n==4:#此时为收盘价,(单日价格-建仓价格)/建仓价格 = 收益率
                start_value.append(dict[key][key2])
            n+=1
    # print(code_stock)
    #  print(index)
    # print(start_value)
    ######获取股票数据部分
    n2=0
    for v in code_stock:
        """
        code_stock=['002045.SZ', '000550.SZ', '600009.SH', '600189.SH', '601919.SH']
        start_value =['13.681', '26.509', '43.96', '11.33', '22.37']
        """
        df_stock =pro_daily_stock(v,starttime, endtime)

        # value.append( round((float(df_stock.Close) - float(start_value[n2])) / float(start_value[n2]) * 100, 2))  # 建仓价格表达式
        value.append(round((float(df_stock.Close)-float(df_stock.Open))/float(df_stock.Open)*100,2)) #开盘价表达式
        n2+=1
    dfnewdata = pd.DataFrame(name_stock)

    dfnewdata[1] = value
    print(dfnewdata)
    return dfnewdata
#定义一个画柱状图函数
def draw_bar_stock(data,time):
    plt.subplot(1,1,1)#建立坐标系
    plt.figure(figsize=(12, 8))
    #数据
    #将数据分离成正的和负的
    y_p=[]#正数
    x_p =[]
    y_m =[]#负数
    x_m =[]
    n =0 #循环开关
    legend_c = 0 #标签打开开关
    for yd in data[1]:
        if yd >= 0:
            y_p.append(yd)
            x_p.append(data[0][n])
            legend_c+=1
        else:
            y_m.append(yd)
            x_m.append(data[0][n])
            legend_c += 2
        n+=1


    #绘图函数
    # 又有正数又有负数
    if legend_c != len(data[0])and legend_c != 2*len(data[0]):
        plt.bar(x_p,y_p,color = 'red',label = "正收益率(%)")
        # 添加数据标签
        for a, b in zip(x_p, y_p):
            plt.text(a, b, "{}%".format(b), ha='center', va='bottom', fontsize=10)
        for a, b in zip(x_m, y_m):
            plt.text(a, b, "{}%".format(b), ha='center', va='bottom', fontsize=10)
        plt.bar(x_m , y_m,color = 'green', label="负收益率(%)")
    # 全正数的情况
    elif legend_c == len(data[0]):
        plt.bar(x_p,y_p,color = 'red',label = "正收益率(%)")
        # 添加数据标签
        for a, b in zip(x_p, y_p):
            plt.text(a, b, "{}%".format(b), ha='center', va='bottom', fontsize=10)
    # 全负数的情况
    elif legend_c == 2*len(data[0]):
        for a, b in zip(x_m, y_m):
            plt.text(a, b, "{}%".format(b), ha='center', va='bottom', fontsize=10)
        plt.bar(x_m , y_m,color = 'green', label="负收益率(%)")

    #设置标题和图例
    plt.title(str(time)+'收益情况',loc = 'center')
    plt.legend()
    #设置xy轴
    plt.xlabel('股票')
    plt.ylabel('收益率')

    #设置坐标轴长度
    y = data[1]
    plt.ylim(y.min()-2, y.max()+5)

    #保存
    # plt.savefig()
    plt.show()

##############调用函数部分
if __name__ == '__main__':
    stock_sum = {'S1': {'股票代码': '600348.SH',
                                 '股票名称': '紫金股份',
                                 '持仓': '2800',
                                 '建仓时间': '20210719',
                                 '建仓价格': '25.80',
                                 '收益情况': ''
                                 },
                 'S2': {'股票代码': '600216.SH',
                                 '股票名称': '浙江医药',
                                 '持仓': '2000',
                                 '建仓时间': '20210719',
                                 '建仓价格': '10.75',
                                 '收益情况': ''
                                 },
                 'S3': {'股票代码': '000698.SZ',
                                  '股票名称': '沈阳化工',
                                  '持仓': '800',
                                  '建仓时间': '20210715',
                                  '建仓价格': '43.96',
                                  '收益情况': ''
                                  },
                 'S4': {'股票代码': '600328.SH',
                                  '股票名称': '中盐化工',
                                  '持仓': '',
                                  '建仓时间': '',
                                  '建仓价格': '',
                                  '收益情况': ''},
                 'S5': {'股票代码': '300046.SZ',
                        '股票名称': '台基股份',
                        '持仓': '',
                        '建仓时间': '',
                        '建仓价格': '',
                        '收益情况': ''},
                 'S6': {'股票代码': '300034.SZ',
                        '股票名称': '钢研高纳',
                        '持仓': '',
                        '建仓时间': '',
                        '建仓价格': '',
                        '收益情况': ''},
                 'S7': {'股票代码': '600893.SH',
                        '股票名称': '航发动力',
                        '持仓': '',
                        '建仓时间': '',
                        '建仓价格': '',
                        '收益情况': ''},
                 'S8': {'股票代码': '002624.SZ',
                        '股票名称': '完美世界',
                        '持仓': '',
                        '建仓时间': '',
                        '建仓价格': '',
                        '收益情况': ''},
                 'S9': {'股票代码': '002151.SZ',
                        '股票名称': '北斗星通',
                        '持仓': '',
                        '建仓时间': '',
                        '建仓价格': '',
                        '收益情况': ''},
                 'S10': {'股票代码': '600316.SH',
                        '股票名称': '洪都航空',
                        '持仓': '',
                        '建仓时间': '',
                        '建仓价格': '',
                        '收益情况': ''}
                 }

    data1 = cal_stock(stock_sum,'20210719','20210719')#当天时间
    draw_bar_stock(data1, '20210719机构推荐')#标题名称


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210719200407667.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTc1NTc1Mg==,size_16,color_FFFFFF,t_70#pic_center)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python利用tushare下载数据并计算当日收益率 的相关文章

  • 熊猫按 n 最大总和分组

    我正在尝试使用groupby nlargest and sum在 Pandas 中一起运行 但在运行时遇到困难 State County Population Alabama a 100 Alabama b 50 Alabama c 40
  • 如何把父母和孩子联系起来?

    有两个简单的类 一个只有parent属性 并且两者兼而有之parent and children属性 这意味着同时具备两者的人parent and children继承自唯一的parent 这是只有parent属性 我们就这样称呼它吧Chi
  • Vimeo API:获取下载所有视频文件的链接列表

    再会 我正在尝试从 Vimeo 帐户获取所有视频文件的列表 直接下载的链接 有没有办法在 1 GET 请求中做到这一点 好的 如果是API限制的话 就100倍 我有硬编码脚本 我在其中发出 12 个 GET 请求 1100 多个视频 根据文
  • 从所有数据帧列中删除子字符串

    我有一个单词列表 大约 1000 个单词 我称之为负面单词 CAST ARTICLES SANITARY JAN CLAUSES SPECIAL ENDORSEMENT 我很快就会用这个单词列表制作一个数据框 我还有一个数据框 看起来像 F
  • 如何替换Python字符串中的正确字母

    任务是 您的任务是纠正数字化文本中的错误 您只需处理以下错误 S 被误解为 5 O 被误解为 0 I 被误解为 1 我的代码 def correct string for i in string if 5 in string string
  • DynamodB:如何更新排序键?

    该表有两个键 filename 分区键 和eventTime 排序键 我要更新eventTime对于某些filename Tried put item and update item 发送相同的filename与新的eventTime但这些
  • 使用管理员权限打开cmd(Windows 10)

    我有自己的 python 脚本来管理我的计算机上的 IP 地址 它主要在命令行 Windows 10 中执行netsh命令 您必须具有管理员权限 这是我自己的计算机 我是管理员 运行脚本时我已经使用管理员类型的用户 Adrian 登录 我无
  • Python 不考虑 distutils.cfg

    我已经尝试了给出的所有内容 并且所有教程都指向相同的方向 即使用 mingw 作为 python 而不是 Visual C 中的编译器 我确实有 Visual C 和 mingw 当我想使用 pip 安装时 问题开始出现 它总是给Unabl
  • 使用 Python 和 lmfit 拟合复杂模型?

    我想适合椭偏仪 http en wikipedia org wiki Ellipsometry使用 LMFit 将数据转换为复杂模型 两个测量参数 psi and delta 是复杂函数中的变量rho 我可以尝试将问题分离为实部和虚部共享参
  • Python speedtest.net,或等效的[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是否有一个 Python 库可以实现 SpeedTest net 测试或等效的互联网连接速度测试 GitHub上有一个项目叫速度检查 https gi
  • 如何找到多个 pandas 数据框中一对列与任意顺序对的交集?

    我有多个 pandas 数据框 为了简单起见 假设我有三个 gt gt df1 col1 col2 id1 A B id2 C D id3 B A id4 E F gt gt df2 col1 col2 id1 B A id2 D C id
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 如何知道python运行脚本的路径?

    sys arg 0 给我 python 脚本 例如 python hello py 返回 sys arg 0 的 hello py 但我需要知道 hello py 位于完整路径中的位置 我怎样才能用Python做到这一点 os path a
  • multiprocessing.Queue 中的 ctx 参数

    我正在尝试使用 multiprocessing Queue 模块中的队列 实施 https docs python org 3 4 library multiprocessing html exchang objects Between p
  • Snakemake:将多个输入用于具有多个子组的一个输出的规则

    我有一个工作管道 用于下载 比对和对公共测序数据执行变体调用 问题是它目前只能在每个样本的基础上工作 i e作为每个单独测序实验的样本 如果我想对一组实验 例如样本的生物和 或技术复制 执行变体调用 则它不起作用 我试图解决它 但我无法让它
  • Python脚本从字母和两个字母组合生成单词

    我正在编写一个简短的脚本 它允许我使用我设置的参数生成所有可能的字母组合 例如 b a 参数 单词 5 个字母 第三 第五个字母 b a 第一个字母 ph sd nn mm 或 gh 第二 第四个字母 任意元音 aeiouy 和 rc 换句
  • AttributeError: 'super' 对象没有属性 '__getattr__' 在 Kivy 中使用带有多个 kv 文件的 BoxLayout 时出错

    我很清楚 这个问题已经被问过好几次了 但尝试以下解决方案后 Python Kivy AttributeError 尝试获取 self ids 时 super 对象没有属性 getattr https stackoverflow com qu
  • 将 Django 中的所有视图限制为经过身份验证的用户

    我是 Django 新手 我正在开发一个项目 该项目有一个登录页面作为其索引和一个注册页面 其余页面都必须仅限于登录用户 如果未经身份验证的用户尝试访问这些页面 则必须将他 她重定向到登录页面 我看到 login required装饰器会将
  • 超过两个点的Python相对导入

    是否可以使用路径中包含两个以上点的模块引用 就像这个例子一样 Project structure sound init py codecs init py echo init py nix init py way1 py way2 py w
  • Tkinter 将鼠标点击绑定到框架

    我一定错过了一些明显的东西 我的 Tkinter 程序中有两个框架 每个框架在网格布局中都有一堆标签 我想将鼠标点击绑定到其中一个而不是另一个 我目前使用 root bind

随机推荐

  • ubuntu20.04 apt 安装报 E: Unable to correct problems, you have held broken packages.

    在安装软件的时候报错 root root sudo apt get install vim Reading package lists Done Building dependency tree Reading state informat
  • Leetcode刷题日志5.0

    目录 前言 1 两数相加 2 无重复字符的最长子串 3 整数反转 4 删除链表的倒数第 N 个结点 前言 今天我又来继续分享最近做的题了 现在开始进入我们快乐的刷题时间吧 编程语言Python3 0 难度 中等 1 两数相加 给你两个 非空
  • Redis工具类(缓存操作,Object转换成JSON数据)

    依赖spring data redis 2 4 1 jar Component Data public class RedisUtils Autowired private RedisTemplate
  • 双向链表详解

    目录 一 双向链表的概念及结构 二 双向链表的方法及其实现 2 1 双向链表 2 2 addFirst int data 头插法 2 3 addLast int data 尾插法 2 4 size 链表长度 2 5 display 打印链表
  • Centos6.4 用rpm方式安装MySql5.6

    1 查看系统是否安装了MySQL 使用命令 rpm qa grep mysql 2 卸载已安装的MySQL 卸载mysql命令如下 rpm e nodeps mysql libs 5 1 61 4 el6 x86 64 要将 var lib
  • sql局部变量和全局变量_有效使用SQL内置全局变量

    SQL内置全局变量是只读的 由IBM DB2 for i维护 并且是受信任且易于使用的资源 存在一些全局变量是为了与DB2系列兼容 并且包含在SYSIBM模式中 其他全局变量提供IBM i特定的值 并包含在QSYS2模式中 全局变量使应用程
  • 【实验二】【创建表并输入数据】

    文章目录 目的表 XSQK 学生情况 KC 课程 XS KC 学生 课程 T SQL创建表 1 新建查询 2 切换数据库 3 输入T SQL查询语句创建表 XSQK 学生情况 KC 课程 XS KC 学生 课程 4 执行命令 5 查看表 S
  • JVM笔记5:虚拟机栈

    目录 1 虚拟机主要特点 虚拟机栈出现的背景 初步印象 内存中的栈与堆 虚拟机栈基本内容 2 虚拟机栈的常见异常与如何设置栈大小 3 栈的存储结构和运行原理 栈中存储什么 栈运行原理 4 栈帧的内部结构 每个栈帧中存储着 5 局部变量表 6
  • 基于python的全球疫情数据分析及可视化系统

    源码获取 https www bilibili com video BV1Ne4y1g7dC 现如今 随着互联网的发展 人们获取信息的方式也各有不同 以前的传统方式的信息流与电视 报纸 书籍 信件 等等 因为互联网的使用 现在的互联网媒体已
  • C++ 判断文件是否被打开,防止重复打开

    如何判断文件是否已经被打开 在这里通过文件的一些属性实现判断文件是否被打开 通过QFile将文件尝试实现例如linux的move操作和rm r 的操作 就可以判断是否文件被占用 首先添加 include QFile 头文件 再设置全局的判断
  • 项目中:Json文件的读取

    项目中 Json文件的读取 读Json文件 取Json文件中内容 举例 举例 Json文件内容如下 Flickr8k images sentids 39300 39301 39302 39303 39304 imgid 7860 sente
  • C++11中 std::bind 的两种用法

    概述 std bind的头文件是
  • hadoop环境搭建之关闭防火墙和SELinux

    每一台服务器上都要做1 2 1 关闭防火墙 查看防火墙状态 systemctl status firewalld 关闭防火墙 systemctl disable firewalld systemctl stop firewalld 查看防火
  • iOS 获取系统键盘UIKeyboard方法

    公司项目需求 需要让弹窗显示在键盘所在的图层之上 而不是在弹窗出现的时候消失 如图1 系统弹窗出现的时候会使键盘暂时不显示 而这种效果显然不符合要求的 由于没想到更好的办法 只好从键盘自身的UIKeyboard做文章了 通过获取当前键盘的U
  • 【Java多线程批量数据导入的方法】

    前言 当遇到大量数据导入时 为了提高处理的速度 可以选择使用多线程来批量处理这些处理 常见的场景有 大文件导入数据库 这个文件不一定是标准的CSV可导入文件或者需要在内存中经过一定的处理 数据同步 从第三方接口拉取数据处理后写入自己的数据库
  • 按装完mysql怎么启动_mysql安装完怎么启动服务器?

    mysql安装完启动服务器的方法 1 打开 开始 菜单 依次点击 管理工具 服务 打开系统服务窗口 2 在 服务 窗口中找到 MySQL 右击选择 启动 命令就可以启动mysql服务器了 mysql 是世界流行的开源数据库系统 下面本篇文章
  • 关于TypeScript和React的使用

    TS和React的使用 接口与类型 type与interface 内置的语法糖 Partial和Required Readonly Omit Exclude 继承 接口与类型 type与interface 内置的语法糖 Partial和Re
  • ffmpeg错误码

    cpp view plain copy AVERROR BSF NOT FOUND 1179861752 AVERROR BUG 558323010 AVERROR DECODER NOT FOUND 1128613112 AVERROR
  • 数字化转型中的国产化替代之路

    引言 数字经济浪潮席卷全球 我国数字经济已进入快速发展阶段 加快推进企业数字化转型 已成为共识 同时有利于构建全产业链数字化生态 增强产业链上下游的自主可控能力 为数字经济社会发展 构建数智化生态注入新动能 在此过程中 国产软件企业作为数字
  • python利用tushare下载数据并计算当日收益率

    python利用tushare下载数据并计算当日收益率 计算股票收益率的程序主要有以下几部分构成 1 获取股票接口数据函数 pro daily stock 2 计算收益率函数 cal stock 里面有两种计算式 你可以根据自己字典写入建仓