Python股票开源库akshare的具体使用

 更新时间:2024年04月01日 10:23:23   作者:数据人阿多  
AKShare是一个开源财经数据接口库,本文主要介绍了Python股票开源库akshare的具体使用,具有一定的参考价值,感兴趣的可以了解一下

背景

从小编真实接触股票已经有10年之久了,因为大学的专业就是数据与应用数据(金融学方向),大三、大四学期时学习了很多涉及金融相关的课程,特别是在大四时,老师还专门给每位同学开通了模拟炒股的账户,让全班同学一起模拟炒股,但小编用真金白银炒股的时间大概是2018年,距现在也有5年时间,一直是韭菜中

最近大家也看到了曾任《环球时报》总编辑的胡锡进,也开始入市炒股,并且每天都会发博文,分享当天的炒股感受

于是小编就试着获取股票的数据来研究一下,经过查找与对比,小编决定用akshare这个库,因为该库一直有更新,并且文档是中文,而且比较详细,

各种数据

akshare文档地址:https://www.akshare.xyz/

akshare

AKShare是一个开源财经数据接口库,所采集的数据皆来自公开的数据源,本文目的是当上市公司发布财报时,在同花顺上获取其关键指标并输出摘要,可以用来写行研的日报等。

选择AKShare的原因:免费且能迅速获得数据,tushare、baostock等库一般不能获得当天发的财报数据,而AKShare可以获得各大权威财经网站的数据。

股票各种数据获取方法

导入akshare库

import akshare as ak
import pandas as pd

1、股票的基本信息数据

ak.stock_individual_info_em(symbol="000651")

基本信息

2、实时数据,当日的成交数据

单次返回所有沪深京 A 股上市公司的实时行情数据

ak.stock_zh_a_spot_em()   

实时数据

3、历史数据,历史的成交数据

ak.stock_zh_a_hist(symbol="000651", 
                   period="daily", 
                   start_date="20230701", 
                   end_date='20230725', 
                   adjust=""   #不复权
                  )  

历史数据

4、资金流向数据

限量: 单次获取指定市场和股票的近 100 个交易日的资金流数据

ak.stock_individual_fund_flow(stock="000651", market="sz")

资金流向数据

5、行情报价,买卖各5档

ak.stock_bid_ask_em(symbol="000651")

行情报价

根据数据生成摘要

函数如下,注意参数和后面的函数要对应。这里的代码稍显麻烦,主要是在描述同比涨跌幅时公司有要求,具体生成的格式大家可按自己的要求进行更改。

def generate_summary(name, period_desc, revenue, revenue_change, profit, profit_change, pre_profit):
    if revenue_change > 0:
        revenue_desc = f"同比上升{revenue_change:.2f}%"
    elif revenue_change < 0:
        revenue_desc = f"同比下降{abs(revenue_change):.2f}%"
    else:
        revenue_desc = "同比持平"
 
    if profit >= 0 and pre_profit >= 0:
        if profit > pre_profit:
            profit_decs = f"同比上升{profit_change:.2f}%"
        elif profit < pre_profit:
            profit_decs = f"同比下降{abs(profit_change):.2f}%"
        else:
            profit_decs = "同比持平"
    elif profit > 0 > pre_profit:
        profit_decs = "扭亏为盈"
    elif profit < 0 < pre_profit:
        profit_decs = "转盈为亏"
    else:  # 连年亏损
        if abs(profit) > abs(pre_profit):
            profit_decs = "亏损扩大"
        elif abs(profit) < abs(pre_profit):
            profit_decs = "亏损减少"
        else:
            profit_decs = "同比持平"
    # 转化为亿元、万元的单位
    revenue = get_unit(revenue)
    profit = get_unit(profit)
 
    summary = f"【{name}】{period_desc}实现营业总收入{revenue},{revenue_desc};" \
              f"归母净利润{profit},{profit_decs}。"
    return summary

获取摘要

需要输入报告期和股票代码。(这里只获取营收和利润数据,注意同花顺上这个净利润实际上是指归母净利润)

date_mapping_1 = {
    "03-31": "季度报告:",
    "06-30": "半年度报告:",
    "09-30": "季度报告:",
    "12-31": "年度报告:"
}
date_mapping_2 = {
    "03-31": "Q1",
    "06-30": "H1",
    "09-30": "前三季度",
    "12-31": "年"
}
 
 
def get_summary():
    period = period_entry.get()
    code_list = code_list_entry.get().split(',')
    try:
        results = []  # 输出结果
 
        title = date_mapping_1.get(period[5:], "未知")  # 摘要标题
        if title == "未知":
            messagebox.showerror("报告期错误")
            return  # 结束函数的运行
        quarter = date_mapping_2.get(period[5:], "未知")  # 季度描述
 
        # 获取去年同期的报告期字符串
        year = period[:4]  # 获取前四个字符
        int_year = int(year) - 1  # 将前四个字符转换为数字并减去1
        last_year = str(int_year).zfill(4)  # 将得到的数字转换为字符串,补齐至四位
        yoy_period = period.replace(year, last_year, 1)  # 替换字符串的前四个字符,得到去年同期的报告期
 
        period_desc = f"{title}公司{year}{quarter}"
 
        # 对每个输入的code取数据
        for code in code_list:
            # 检查code能否匹配公司
            try:
                company = ak.stock_individual_info_em(symbol=code)
                name = company.iloc[5][1]
            except KeyError:
                results.append(f"[code]:无法匹配\n")
                continue
            # 从同花顺获取关键财务指标
            try:
                data = ak.stock_financial_abstract_ths(symbol=code, indicator="按报告期")
                data = data.set_index(data.columns[0])
            except KeyError:
                results.append(f"[code]:{name}获取财报数据失败\n")
                continue
            # 判断是否存在数据
            try:
                revenue = remove_unit(data.loc[period, "营业总收入"])
                revenue_change = str2percentage(data.loc[period, "营业总收入同比增长率"])
                profit = remove_unit(data.loc[period, "净利润"])
                profit_change = str2percentage(data.loc[period, "净利润同比增长率"])
                # 获取去年归母净利润数据
                pre_profit = remove_unit(data.loc[yoy_period, "净利润"])
            except KeyError:
                results.append(f"[code]:{name}报告未更新\n")
                continue
 
            # 调用函数获取财报摘要,并保存在输出列表中
            summary = generate_summary(name, period_desc, revenue, revenue_change, profit, profit_change, pre_profit)
            results.append(f"{summary}\n")
        result_text.config(state='normal')  # 将输出区域状态更改为可编辑
        result_text.delete('1.0', tk.END)  # 清空区域
        result_text.insert(tk.END, "\n".join(results))  # 将输出列表中的内容以换行符分隔,添加到输出区域中
        result_text.config(state='disabled')  # 将输出区域状态更改为不可编辑
    except Exception as e:
        messagebox.showerror("Error", f"获取摘要时出错:{str(e)}")
 
 
# 创建主窗口
root = tk.Tk()
root.title("日报-财务报告摘要akshare")
 
# 添加标签和输入框
period_label = tk.Label(root, text="请输入报告期(如2023-06-30)")
period_label.pack()
 
period_entry = tk.Entry(root)
period_entry.pack()
 
code_list_label = tk.Label(root, text="请输入公司code(多个则以英文逗号分隔)")
code_list_label.pack()
 
code_list_entry = tk.Entry(root, width=100)
code_list_entry.pack()
 
# 添加按钮
run_button = tk.Button(root, text="运行", command=get_summary)
run_button.pack()
 
# 添加结果显示区域
result_text = tk.Text(root, height=30, width=120, state='disabled')
result_text.pack()
 
# 启动 GUI 循环
root.mainloop()

每日特定股票数据汇总案例

下面展示每日获取特定股票数据,可以做成定时任务,在15:00闭市后获取

"""
===========================
@Time : 2023/7/26 20:13
@File : stock_day
@Software: PyCharm
@Platform: Win10
@Author : DataShare
===========================
"""
import akshare as ak
import pandas as pd
import datetime
import sys

def stock_to_excel(stock_code, stock_name):
    if stock_code[0] == '6':
        market = 'sh'
    elif stock_code[0] == '0':
        market = 'sz'

    df1 = ak.stock_zh_a_spot_em()
    df2 = df1[df1['代码'] == stock_code]

    dt = str(datetime.date.today())   #当日
    df3 = ak.stock_individual_fund_flow(stock=stock_code, market=market) #在15:00之后获取
    df4 = df3[df3['日期'] == dt]

    result = {
        "日期": dt,
        "股票代码": stock_code,
        "股票名称": stock_name,
        "前一日收盘价": df2['昨收'].to_list()[0],
        "开盘": df2['今开'].to_list()[0],
        "收盘": df2['最新价'].to_list()[0],
        "最高": df2['最高'].to_list()[0],
        "最低": df2['最低'].to_list()[0],
        "成交量": df2['成交量'].to_list()[0],
        "成交额": df2['成交额'].to_list()[0],
        "振幅": df2['振幅'].to_list()[0],
        "涨跌幅": df2['涨跌幅'].to_list()[0],
        "涨跌额": df2['涨跌额'].to_list()[0],
        "换手率": df2['换手率'].to_list()[0],
        "量比": df2['量比'].to_list()[0],
        "市盈率-动态": df2['市盈率-动态'].to_list()[0],
        "市净率": df2['市净率'].to_list()[0],
        "60日涨跌幅": df2['60日涨跌幅'].to_list()[0],
        "主力净流入-净额": df4['主力净流入-净额'].to_list()[0],
        "主力净流入-净占比": df4['主力净流入-净占比'].to_list()[0],
        "超大单净流入-净额": df4['超大单净流入-净额'].to_list()[0],
        "超大单净流入-净占比": df4['超大单净流入-净占比'].to_list()[0],
        "大单净流入-净额": df4['大单净流入-净额'].to_list()[0],
        "大单净流入-净占比": df4['大单净流入-净占比'].to_list()[0],
        "中单净流入-净额": df4['中单净流入-净额'].to_list()[0],
        "中单净流入-净占比": df4['中单净流入-净占比'].to_list()[0],
        "小单净流入-净额": df4['小单净流入-净额'].to_list()[0],
        "小单净流入-净占比": df4['小单净流入-净占比'].to_list()[0]
    }

    return result


if __name__ == '__main__':
    stocks_code = {'000651': '格力电器',
                   '002241': '歌尔股份',
                   '002739': '万达电影',
                   '600956': '新天绿能',
                   '600031': '三一重工',
                   '600703': '三安光电',
                   '002027': '分众传媒',
                   '600030': '中信证券',
                   '002939': '长城证券',
                   }   #小编买过的股票
    
    dt = str(datetime.date.today())
    results=[]
    for stock_code, stock_name in stocks_code.items():
        print(f'{stock_name}:{stock_code}')
        try:
            results.append(stock_to_excel(stock_code, stock_name))
        except Exception as e:
            print("运行中出错",e)
            sys.exit(-1)
    
    pd.DataFrame.from_dict(results).to_excel(f'./data/{dt}.xlsx', index=False)

 到此这篇关于Python股票开源库akshare的具体使用的文章就介绍到这了,更多相关Python akshare内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python友情链接检查方法

    python友情链接检查方法

    这篇文章主要介绍了python友情链接检查方法,涉及Python读取txt文件进行友链查询的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-07-07
  • 深入浅析Python中的迭代器

    深入浅析Python中的迭代器

    迭代器是实现了迭代器协议的类对象,迭代器协议规定了迭代器类必需定义__next()__方法。这篇文章主要介绍了Python中的迭代器,需要的朋友可以参考下
    2019-06-06
  • Python正则简单实例分析

    Python正则简单实例分析

    这篇文章主要介绍了Python正则简单实例,具体分析了Python针对字符串的简单正则匹配测试中遇到的问题与相关注意事项,需要的朋友可以参考下
    2017-03-03
  • Python和GO语言实现的消息摘要算法示例

    Python和GO语言实现的消息摘要算法示例

    这篇文章主要介绍了Python和GO语言实现的消息摘要算法示例,本文讲解了python消息摘要示例、go语言消息摘要示例及各自的运行效果,需要的朋友可以参考下
    2015-03-03
  • python 利用jinja2模板生成html代码实例

    python 利用jinja2模板生成html代码实例

    这篇文章主要介绍了python 利用jinja2模板生成html代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Python常见的几种数据加密方式

    Python常见的几种数据加密方式

    这篇文章主要分享的是Python常见的几种数据加密方式,主要包括线性散列算法(签名算法)MD5,sha1、对称性加密算法 AES DES、非对称性加密算法 RSA,具体详细内容介绍,需要的小伙伴可以参考一下
    2022-06-06
  • python绘制散点图和折线图的方法

    python绘制散点图和折线图的方法

    这篇文章主要为大家详细介绍了python绘制散点图和折线图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • python中enumerate函数遍历元素用法分析

    python中enumerate函数遍历元素用法分析

    这篇文章主要介绍了python中enumerate函数遍历元素用法,结合实例形式分析了enumerate函数遍历元素的相关实现技巧,需要的朋友可以参考下
    2016-03-03
  • keras load model时出现Missing Layer错误的解决方式

    keras load model时出现Missing Layer错误的解决方式

    这篇文章主要介绍了keras load model时出现Missing Layer错误的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python endswith()函数的具体使用

    Python endswith()函数的具体使用

    本文主要介绍了Python endswith()函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论