设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 76|回复: 19

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

[复制链接]

2

主题

62

回帖

167

积分

注册会员

积分
167
发表于 2024-4-20 09:44:14 | 显示全部楼层 |阅读模式
目录


背景

从小编真实接触股票已经有10年之久了,因为大学的专业就是数据与应用数据(金融学方向),大三、大四学期时学习了很多涉及金融相关的课程,特别是在大四时,老师还专门给每位同学开通了模拟炒股的账户,让全班同学一起模拟炒股,但小编用真金白银炒股的时间大概是2018年,距现在也有5年时间,一直是韭菜中
最近大家也看到了曾任《环球时报》总编辑的胡锡进,也开始入市炒股,并且每天都会发博文,分享当天的炒股感受
于是小编就试着获取股票的数据来研究一下,经过查找与对比,小编决定用akshare这个库,因为该库一直有更新,并且文档是中文,而且比较详细,

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

AKShare是一个开源财经数据接口库,所采集的数据皆来自公开的数据源,本文目的是当上市公司发布财报时,在同花顺上获取其关键指标并输出摘要,可以用来写行研的日报等。
选择AKShare的原因:免费且能迅速获得数据,tushare、baostock等库一般不能获得当天发的财报数据,而AKShare可以获得各大权威财经网站的数据。

股票各种数据获取方法

导入akshare库
  1. import akshare as ak
  2. import pandas as pd
复制代码
1、股票的基本信息数据
  1. ak.stock_individual_info_em(symbol="000651")
复制代码

2、实时数据,当日的成交数据
单次返回所有沪深京 A 股上市公司的实时行情数据
  1. ak.stock_zh_a_spot_em()   
复制代码

3、历史数据,历史的成交数据
  1. ak.stock_zh_a_hist(symbol="000651",
  2.                    period="daily",
  3.                    start_date="20230701",
  4.                    end_date='20230725',
  5.                    adjust=""   #不复权
  6.                   )  
复制代码

4、资金流向数据
限量: 单次获取指定市场和股票的近 100 个交易日的资金流数据
  1. ak.stock_individual_fund_flow(stock="000651", market="sz")
复制代码

5、行情报价,买卖各5档
  1. ak.stock_bid_ask_em(symbol="000651")
复制代码

根据数据生成摘要
函数如下,注意参数和后面的函数要对应。这里的代码稍显麻烦,主要是在描述同比涨跌幅时公司有要求,具体生成的格式大家可按自己的要求进行更改。
  1. def generate_summary(name, period_desc, revenue, revenue_change, profit, profit_change, pre_profit):
  2.     if revenue_change > 0:
  3.         revenue_desc = f"同比上升{revenue_change:.2f}%"
  4.     elif revenue_change < 0:
  5.         revenue_desc = f"同比下降{abs(revenue_change):.2f}%"
  6.     else:
  7.         revenue_desc = "同比持平"

  8.     if profit >= 0 and pre_profit >= 0:
  9.         if profit > pre_profit:
  10.             profit_decs = f"同比上升{profit_change:.2f}%"
  11.         elif profit < pre_profit:
  12.             profit_decs = f"同比下降{abs(profit_change):.2f}%"
  13.         else:
  14.             profit_decs = "同比持平"
  15.     elif profit > 0 > pre_profit:
  16.         profit_decs = "扭亏为盈"
  17.     elif profit < 0 < pre_profit:
  18.         profit_decs = "转盈为亏"
  19.     else:  # 连年亏损
  20.         if abs(profit) > abs(pre_profit):
  21.             profit_decs = "亏损扩大"
  22.         elif abs(profit) < abs(pre_profit):
  23.             profit_decs = "亏损减少"
  24.         else:
  25.             profit_decs = "同比持平"
  26.     # 转化为亿元、万元的单位
  27.     revenue = get_unit(revenue)
  28.     profit = get_unit(profit)

  29.     summary = f"【{name}】{period_desc}实现营业总收入{revenue},{revenue_desc};" \
  30.               f"归母净利润{profit},{profit_decs}。"
  31.     return summary
复制代码
获取摘要
需要输入报告期和股票代码。(这里只获取营收和利润数据,注意同花顺上这个净利润实际上是指归母净利润)
  1. date_mapping_1 = {
  2.     "03-31": "季度报告:",
  3.     "06-30": "半年度报告:",
  4.     "09-30": "季度报告:",
  5.     "12-31": "年度报告:"
  6. }
  7. date_mapping_2 = {
  8.     "03-31": "Q1",
  9.     "06-30": "H1",
  10.     "09-30": "前三季度",
  11.     "12-31": "年"
  12. }


  13. def get_summary():
  14.     period = period_entry.get()
  15.     code_list = code_list_entry.get().split(',')
  16.     try:
  17.         results = []  # 输出结果

  18.         title = date_mapping_1.get(period[5:], "未知")  # 摘要标题
  19.         if title == "未知":
  20.             messagebox.showerror("报告期错误")
  21.             return  # 结束函数的运行
  22.         quarter = date_mapping_2.get(period[5:], "未知")  # 季度描述

  23.         # 获取去年同期的报告期字符串
  24.         year = period[:4]  # 获取前四个字符
  25.         int_year = int(year) - 1  # 将前四个字符转换为数字并减去1
  26.         last_year = str(int_year).zfill(4)  # 将得到的数字转换为字符串,补齐至四位
  27.         yoy_period = period.replace(year, last_year, 1)  # 替换字符串的前四个字符,得到去年同期的报告期

  28.         period_desc = f"{title}公司{year}{quarter}"

  29.         # 对每个输入的code取数据
  30.         for code in code_list:
  31.             # 检查code能否匹配公司
  32.             try:
  33.                 company = ak.stock_individual_info_em(symbol=code)
  34.                 name = company.iloc[5][1]
  35.             except KeyError:
  36.                 results.append(f"[code]:无法匹配\n")
  37.                 continue
  38.             # 从同花顺获取关键财务指标
  39.             try:
  40.                 data = ak.stock_financial_abstract_ths(symbol=code, indicator="按报告期")
  41.                 data = data.set_index(data.columns[0])
  42.             except KeyError:
  43.                 results.append(f"[code]:{name}获取财报数据失败\n")
  44.                 continue
  45.             # 判断是否存在数据
  46.             try:
  47.                 revenue = remove_unit(data.loc[period, "营业总收入"])
  48.                 revenue_change = str2percentage(data.loc[period, "营业总收入同比增长率"])
  49.                 profit = remove_unit(data.loc[period, "净利润"])
  50.                 profit_change = str2percentage(data.loc[period, "净利润同比增长率"])
  51.                 # 获取去年归母净利润数据
  52.                 pre_profit = remove_unit(data.loc[yoy_period, "净利润"])
  53.             except KeyError:
  54.                 results.append(f"[code]:{name}报告未更新\n")
  55.                 continue

  56.             # 调用函数获取财报摘要,并保存在输出列表中
  57.             summary = generate_summary(name, period_desc, revenue, revenue_change, profit, profit_change, pre_profit)
  58.             results.append(f"{summary}\n")
  59.         result_text.config(state='normal')  # 将输出区域状态更改为可编辑
  60.         result_text.delete('1.0', tk.END)  # 清空区域
  61.         result_text.insert(tk.END, "\n".join(results))  # 将输出列表中的内容以换行符分隔,添加到输出区域中
  62.         result_text.config(state='disabled')  # 将输出区域状态更改为不可编辑
  63.     except Exception as e:
  64.         messagebox.showerror("Error", f"获取摘要时出错:{str(e)}")


  65. # 创建主窗口
  66. root = tk.Tk()
  67. root.title("日报-财务报告摘要akshare")

  68. # 添加标签和输入框
  69. period_label = tk.Label(root, text="请输入报告期(如2023-06-30)")
  70. period_label.pack()

  71. period_entry = tk.Entry(root)
  72. period_entry.pack()

  73. code_list_label = tk.Label(root, text="请输入公司code(多个则以英文逗号分隔)")
  74. code_list_label.pack()

  75. code_list_entry = tk.Entry(root, width=100)
  76. code_list_entry.pack()

  77. # 添加按钮
  78. run_button = tk.Button(root, text="运行", command=get_summary)
  79. run_button.pack()

  80. # 添加结果显示区域
  81. result_text = tk.Text(root, height=30, width=120, state='disabled')
  82. result_text.pack()

  83. # 启动 GUI 循环
  84. root.mainloop()
复制代码
每日特定股票数据汇总案例

下面展示每日获取特定股票数据,可以做成定时任务,在15:00闭市后获取
  1. """===========================@Time : 2023/7/26 20:13@File : stock_day@Software: PyCharm@Platform: Win10@Author : DataShare==========================="""import akshare as ak
  2. import pandas as pdimport datetimeimport sysdef 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 resultif __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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

0

主题

46

回帖

95

积分

等待验证会员

积分
95

热心会员付费会员

发表于 2024-5-2 13:31:26 | 显示全部楼层
保持尊重和礼貌对待其他成员是必要的。

0

主题

32

回帖

63

积分

注册会员

积分
63
发表于 2024-5-17 21:51:12 | 显示全部楼层
非常感谢你的观点,让我受益良多!

1

主题

77

回帖

177

积分

注册会员

积分
177
发表于 2024-5-21 01:37:04 | 显示全部楼层
同意你的观点,我们有共鸣。

0

主题

39

回帖

79

积分

注册会员

积分
79
发表于 2024-6-11 13:29:37 | 显示全部楼层
666666666666
  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:13
  • 最近打卡:2024-05-10 17:33:31

2

主题

60

回帖

179

积分

注册会员

积分
179
发表于 2024-7-10 21:34:28 | 显示全部楼层
说得太好了,完全同意!

0

主题

53

回帖

107

积分

注册会员

积分
107
发表于 2024-7-14 03:26:37 | 显示全部楼层
确实牛逼

1

主题

55

回帖

133

积分

注册会员

积分
133
发表于 2024-7-20 07:56:19 | 显示全部楼层
我不太确定,可能需要再确认一下。

2

主题

37

回帖

119

积分

注册会员

积分
119
发表于 2024-7-21 11:01:38 | 显示全部楼层
保持尊重和礼貌对待其他成员是必要的。

1

主题

57

回帖

137

积分

注册会员

积分
137
发表于 2024-7-21 22:18:48 | 显示全部楼层
我想了解更多
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-15 05:22 , Processed in 0.084729 second(s), 29 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表