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下载数据并计算当日收益率 的相关文章

  • Flask 无法播放 html 中的视频

    我有一个 Flask 应用程序 应该在加载页面时播放视频 但它只显示在左上角 并且不会从视频的第一帧开始改变 我已经尝试将其插入 html 代码但它不起作用 extends base html block content
  • 使用Python Selenium访问网页上的表对象

    一段时间以来 我尝试从网页中提取下表 我正在尝试进入网站上不同页面的 tr 对象 1 8 我设法存储并打开页面 并希望循环遍历表 tbody 其中包含 tr 对象 表示我想要访问的信息行 然而 当运行以下代码时 我只获得所有 8 个页面中的
  • 计算 python 字典/数组数据结构的非空尾叶 - 递归算法?

    我正在寻找一个函数来查找一种复杂字典 数组结构的所有非空端点 我认为因为我不知道嵌套数组的数量或它们的位置 所以它必须是递归的 而我只是还没有完全理解这种思维方式 所以对于嵌套字典 x top middle nested value nes
  • 按位置对 MultiIndex pandas DataFrame 进行切片

    我目前正在尝试按位置对具有三个级别的多索引数据帧进行切片 我正在使用熊猫 19 1 Level0 Level1 Level2 Value 03 00368 A Item111 6 9 03 00368 A Item333 19 2 03 0
  • 确定非空列表条目是否“连续”的 Pythonic 方法

    我正在寻找一种方法来轻松确定列表中所有非 None 项目是否出现在单个连续切片中 我将使用整数作为非 None 项目的示例 例如 列表 None None 1 2 3 None None 满足我对连续整数条目的要求 相比之下 1 2 Non
  • 导入错误:无法导入名称 md5

    真的不知道这里发生了什么 我需要在弹性beanstalk上部署我的flask应用程序 但不知何故改变了路径并且无法再运行python application py dotnet info NET Core SDK reflecting an
  • 计算具有不同 x 值的 y 值的平均值

    我试图计算平均值y来自不同的数组 例如np mean axis 1 但与不同的x values 生产x and y数组 我使用的代码如下 x1 np arange 10 x2 np arange 10 1 x3 np arange 10 2
  • 如何提取图像中的表格

    我想从图像中提取表格 这个 python 模块https pypi org project ExtractTable https pypi org project ExtractTable 与他们的网站https www extractta
  • Python:安装 numpy 时出现损坏的工具链错误

    我正在使用 Python 2 7 3 并尝试在 Windows 计算机上安装 numpy 包 但收到运行时错误 提示 工具链损坏 无法链接到简单的 C 程序 我读了解决方案here https stackoverflow com quest
  • 字典损坏了键的名称 [Python]

    我的问题是 当我输入带重音的输入时 字典会存储不同的键名 它会用字符代码替换重音字符 我是新来的 我接受一切帮助 感谢您的帮助 usr bin python coding utf 8 products try prodNum int raw
  • 使用 Pyinstaller 制作 exe 文件时出现问题(使用 tkinter 和 Custom tkinter 制作的文件)

    我正在尝试使用 tkinter 和自定义 tkinter 制作一个用于数据输入的小型应用程序 代码在 python 中运行良好 我使用它制作了 exe 文件 pyinstaller onefile noconsole try45 py 但在
  • 快速NLTK解析成语法树

    我正在尝试将数百个句子解析为语法树 我需要快速完成 问题是如果我使用 NLTK 那么我需要定义一个语法 而我不知道我只知道它会是英语 我尝试使用this https github com emilmont pyStatParser统计解析器
  • 如何避免绘图散点图中的文本重叠?

    我正在寻找一种解决方案来避免文本标签中的文本重叠 我用散点图创建图像 也许这里有自动化 from pandas import util import plotly express as px import plotly graph obje
  • 优化Python:大数组、内存问题

    我在运行 python numypy 代码时遇到速度问题 我不知道如何让它更快 也许其他人 假设有一个表面有两个三角剖分 一个是细三角剖分 fine 有 M 个点 一个是粗剖分 有 N 个点 此外 还有每个点的粗网格数据 N 个浮点数 我正
  • 在Python中将一个方法(带参数)传递给另一个方法的最佳方法是什么

    将方法和方法参数传递给另一个方法的最佳方法是什么 有更好的方法来执行以下操作吗 def method1 name return Hello name def method2 methodToCall methodToCallParams q
  • ValueError: n_splits=10 不能大于每个类中的成员数

    我正在尝试运行以下代码 from sklearn model selection import StratifiedKFold X hey join now hello join today join us now not today jo
  • 从 XML 文档生成嵌套列表

    在 python 中工作 我的目标是解析我制作的 XML 文档并创建一个嵌套的列表列表 以便稍后访问它们并解析提要 XML 文档类似于以下代码片段
  • 如何使用 pandas groupby 函数根据 groupby 值应用公式

    我的问题可能有点令人困惑 所以让我解释一下 我有一个信息数据框 我想按唯一订单 ID 对其进行分组 该 ID 将生成以下列 sum qty 每个订单 ID 执行的总金额 csv 这是每个订单 ID 的 csv 列的总和除以订单 ID 的已执
  • 维基百科与 Python

    我有这个非常简单的 python 代码来读取 wikipedia api 的 xml import urllib from xml dom import minidom usock urllib urlopen http en wikipe
  • 在ubuntu 18.04上安装python 2.7

    有没有办法在 Ubuntu 18 04 上安装 Python 2 7 我尝试了这个命令 但它不起作用 sudo apt install python minimal 有没有办法手动安装 我尝试使用 python 2 7 作为不支持 pyth

随机推荐

  • 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 里面有两种计算式 你可以根据自己字典写入建仓