tushare(使用Python获取历史股价信息的几种方式)
更新时间:2022-10-05 10:07:21通过编程获取历史股价的方式很多,但是免费的方式可以简单地分为四类:
- 使用某种网友开发的插件: 比如Python就有TuShare, akshare, 这种只需要写几行代码就能获取,但是不同的库有不同的利弊。比如TuShare中有很多数据需要一定的积分才能获取。
- 通过API接口,比如新浪,腾讯等等。
- 从专门的行情软件上面提取数据。
- 从财经网站上面爬取行情数据。
使用TuShare获取股价
TuShare是非常方便使用的, 比如在官网拿到Token后, 一行调用就可以获取股价信息:
import tushare as ts
ts.set_token('***')
pro = ts.pro_api()
price = ts.pro_bar(ts_code='000020.SZ', start_date='2022-09-01',\
end_date='2022-09-09')
price
结果如图:
通过API获取价格信息
新浪API
接口 | 描述 |
http://hq.sinajs/list= 股票代码 | 当日行情 |
http://hq.sinajs/list=s_ 股票代码 | 实时行情 |
请求例子:
import requests
stock_code = 'sh600031,sz300866'
header = { 'referer': 'http://finance.sina' }
# 当日行情接口
response = requests.get(f'http://hq.sinajs/list={stock_code}', headers=header)
print(response.text)
结果
var hq_str_sh600031="三一重工,15.750,15.750,16.260,16.310,15.660,16.260,16.270,
105649444,1702155639.000,6161,16.260,870579,16.250,132500,16.240,87700,16.230,
103100,
16.220,400510,16.270,328600,16.280,198700,16.290,795400,16.300,548100,16.310,2022-09-09,15:00:00,00,";var hq_str_sz300866="安克创新,59.250,58.620,59.150,59.420,57.850,59.150,59.160,
1703977,100420830.250,700,59.150,300,59.140,300,59.130,2000,59.120,7400,59.110,
300,
59.160,2000,59.170,2700,59.190,700,59.200,400,59.250,2022-09-09,15:35:00,00,D|0|0.000";
以上数据用,分割字符串中的内容,下标从0开始,依次为:
标号 | 内容 | 标号 | 内容 |
0 | 股票名字 | 1 | 当天开盘价 |
2 | 昨日收盘价 | 3 | 当天收盘价 |
4 | 当天最高价 | 5 | 当天最低价 |
... |
指数也可以用这种方式获取。但是无法获取历史的股价信息。如果某天没有及时同步到本地数据库,就无法使用该接口获取那天的数据。接口可以一定性请求多个股票代码,用,隔开,不能有空格。
另外,这个接口现在一定要添加请求头:
header = { 'referer': 'http://finance.sina' }
不然就会报错,提示:
Kinsoku jikou desu!
也就是日本语“禁止访问”的意思。很艺文!
腾讯API
接口 | 描述 |
http://qt.gtimg/q= 股票代码 | 最新行情 |
http://qt.gtimg/q=ff_ 股票代码 | 获取实时资金流向 |
http://qt.gtimg/q=s_pk 股票代码 | 分析 |
http://qt.gtimg/q=s_sh 股票代码 | 简要信息 |
请求例子:
import requests
stock_code = 'sh600031,sz300866'
# 当日行情接口
response = requests.get(f'http://qt.gtimg/q={stock_code}', timeout=6)
print(response.text)
结果
v_sh600031="1~三一重工~600031~16.26~15.75~15.75~1056494~612059~444435~16.26~
62~16.25~8706~16.24~1325~16.23~877~16.22~1031~16.27~4005~16.28~3286~16.29~1987~
16.30~7954~16.31~5481~~20220909160001~0.51~3.24~16.31~15.66~
16.26/1056494/1702155639~1056494~170216~1.24~30.06~~16.31~15.66~4.13~1381.01~
1381.01~2.20~17.33~14.18~2.47~-10712~16.11~26.21~11.48~~~1.51~170215.5639~0.0000~
0~ ~GP-A~-27.26~4.16~2.75~7.32~3.17~28.30~14.13~4.77~-3.21~-9.62~8493286021~
8493286021~-30.86~-29.80~8493286021~~~-41.60~0.06~";
v_sz300866="51~安克创新~300866~59.15~58.62~59.25~17040~9711~7329~59.15~7~59.14~3~
59.13~3~59.12~20~59.11~74~59.16~3~59.17~20~59.19~27~59.20~7~59.25~4~~20220909161451~
0.53~0.90~59.42~57.85~59.15/17040/100420830~17040~10042~1.13~20.92~~59.42~57.85~
2.68~89.46~240.40~3.82~70.34~46.90~0.70~46~58.93~20.88~24.49~~~1.45~10042.0830~
0.0000~0~ AR~GP-A-CYB~-41.84~-3.30~1.35~18.25~13.07~128.07~48.89~-6.41~-13.66~
-5.83~151240045~406427207~27.38~-46.32~151240045~~~-45.35~-0.03~";
以上数据用~分割字符串中的内容,下标从0开始,依次为:
标号 | 内容 | 标号 | 内容 |
0 | 未知 | 1 | 股票名字 |
2 | 股票代码 | 3 | 当前价格 |
4 | 昨收 | 5 | 今开 |
6 | 成交量(手) | 7 | 外盘 |
8 | 内盘 | 9 | 买一 |
10 | 买一量(手) | 11-18 | 买二 |
19 | 卖一 | 20 | 卖一量 |
21-28 | 卖二 | 29 | 最近逐笔成交 |
30 | 时间 | 31 | 涨跌 |
32 | 涨跌% | 33 | 最高 |
34 | 最低 | 35 | 价格/成交量(手)/成交额 |
36 | 成交量(手) | 37 | 成交额(万) |
38 | 换手率 | 39 | 市盈率 |
40 | 41 | 最高 | |
42 | 最低 | 43 | 振幅 |
44 | 流通市值 | 45 | 总市值 |
46 | 市净率 | 47 | 涨停价 |
48 | 市净率 |
弊端就是哪天接口被禁用了,这种方式就用不了了。
从专门的行情软件上面提取数据
通达信
通达信是使用非常广泛的行情软件,其公司财富趋势已经在港交所上市。在通达信软件上下载行情后,数据会下载到本地(至少此时2022-09-10是这样)。数据在通达信的安装目录下:
可以使用程序读出来。附完整解析代码:
import struct
import datetime
class stock_price:
def __init__(self, stock_date, stock_open, stock_high,\
stock_low, stock_close, stock_amount, stock_vol):
self.stock_date = stock_date
self.stock_open = stock_open
self.stock_high = stock_high
self.stock_low = stock_low
self.stock_close = stock_close
self.stock_amount = stock_amount
self.stock_vol = stock_vol
def get_stock_price(filepath):
data = []
with open(filepath, 'rb') as f:
while True:
stock_date = fad(4)
stock_open = fad(4)
stock_high = fad(4)
stock_low= fad(4)
stock_close = fad(4)
stock_amount = fad(4)
stock_vol = fad(4)
stock_reservation = fad(4)
if not stock_date:
break
stock_date = struct.unpack("l", stock_date) # 4字节 如20220909
stock_open1 = struct.unpack("l", stock_open) #开盘价*100
stock_high1 = struct.unpack("l", stock_high) #最高价*100
stock_low= struct.unpack("l", stock_low) #最低价*100
stock_close = struct.unpack("l", stock_close) #收盘价*100
stock_amount = struct.unpack("f", stock_amount) #成交额
stock_vol = struct.unpack("f", stock_vol) # 成交量
stock_reservation = struct.unpack("f", stock_reservation) #保留值
date_format = datetime.datetime.strptime(str(stock_date[0]),\
'%Y%M%d') #格式化日期
data.append(stock_price(date_format.strftime('%Y-%M-%d'),
stock_open1[0]/100.0,
stock_high1[0]/100.0,\ stock_low[0]/100.0, stock_close[0]/100.0, stock_amount[0]/100.0, \
stock_vol[0]/100.0))
return data
找一个文件试试:
data_list = get_stock_price('./sz000002.day')
print(f'交易日期: {data_list[-1:][0].stock_date}')
print(f'开盘价: {data_list[-1:][0].stock_open}')
print(f'最高价: { data_list[-1:][0].stock_high}')
print(f'最低价: { data_list[-1:][0].stock_low}')
print(f'收盘价: { data_list[-1:][0].stock_close}')
输出:
交易日期: 2022-09-09
开盘价: 17.49
最高价: 18.39
最低价: 17.41
收盘价: 18.15
在同花顺里面验证了下价格信息,是正确的。不过这种方式的弊端在于,需要手工在通达信里面执行更新数据的操作,并且通达信在未来某天变更了读写文件的方式,这种方式就不能用了。其它的软件也是类似的。这里要注意的是,如果需要读取指数的信息,
struct.unpack("l", stock_open)
这行代码里面的格式需要变动一下,目前变成
struct.unpack("f", stock_open)
即可。
从财经网站上面爬取行情数据
这种是最靠谱的方式的,但是实现也是比较繁琐的,某种程度上,也有法律上面的风险,参考:中国爬虫违法违规案例汇总 (
https://github/HiddenStrawberry/Crawler_Illegal_Cases_In_China)。股票价格数据都是公开的,不是什么隐私,但是程序写的不好,把目标网站爬宕机了,就有法律风险了。上面例子中的新浪API接口还是很稳定,支持高并发的。貌似可能是某个性能高手开发的, 参考: 杨建:网站加速--服务器编写篇(上)(
https://blog.csdn/lishenglong666/article/details/39028093), 原文不见了,放个转载。
提供股价信息的部分网站
- 雪球, https://xueqiu
- 集思录, https://www.jisilu/
- 巨潮资讯网, http://wwwinfo
- 百度股市通, https://gushitong.baidu
- 东方财富网, https://www.eastmoney/
- 同花顺, https://www.10jqka/
......
- 最新资讯
-
- 2022-11-15 世界杯8分之一比赛比分(世界杯小历史,1990世界杯1/8决赛,艰难的胜利,普拉特漂亮一击)
- 2022-11-15 12年奥运会金牌哪个国家最多(世运会最终奖牌榜:中国第十,乌克兰第三,德国力压美国排名榜首)
- 2022-11-15 我对穆帅有种特殊的感情(纵你虐我千百遍,我仍待你如初恋!穆里尼奥:希望曼联早日复兴)
- 2022-11-15 菲律宾韩国街在哪里(韩国 | 九月初的济州岛,时有风,偶有雨)
- 2022-11-15 欧联杯冠军进欧冠什么时候(欧冠赛与欧联杯的区别,你知道多少?)
- 2022-11-15 为什么nba篮球员妻子都爱(为何科比的妻子那么受欢迎呢,十几个人追求?拥有三个魅力原因)
- 2022-11-15 5号篮球和7号篮球图(2022-2023赛季NBA每支球队的城市版球衣)
- 2022-11-15 花式运球有错吗(指责队友犯规,自己花式运球失误?郭艾伦的脾气决定辽篮上限)
- 2022-11-15 我想看霹雳赛车(嘲讽值拉满,魏国黑科技霹雳车,守九宫八卦能打赢满红吴骑)
- 2022-11-15 马内造红牌 破门(马内遭“爆头”仍坚持比赛15分钟并进球,球迷痛批塞内加尔换人不及时)
- 推荐攻略
-
-
乌克兰总统身亡(乌总统泽连斯基解除乌总检察长及国家安全局局长职务)
-
足球比赛每个半场多少分钟(足球比赛每半场几分钟)
-
2021中超今天哪里转播(今晚!中超2场对决,CCTV5 直播申花PK武汉,腾讯体育亚泰vs天津)
-
2022梅西坠机身亡事件结果(足坛变天!巴萨无缘榜首的2年:梅西告别,老马去世,2-8惨案)
-
2021全运会篮球直播赛程辽宁(4月22日央视直播:CBA总决赛;赵心童vs马奎尔,塞尔比vs颜丙涛)
-
中国最强导弹(世界洲际导弹前10排名,中国东风导弹领先美国,第一名堪称导弹王)
-
2021篮球比赛在哪里看(CCTV5直播NBA 辽篮争夺CBA总决赛冠军点 颜丙涛出战斯诺克世锦赛)
-
东航结果不敢公布了(民航局再次回应东航MU5735事故调查!查明原因有多难,多久公布?)
-