社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何用Python获取实时的股票数据?

马哥Linux运维 • 3 年前 • 2691 次点击  

先上个展示图


股票代码为 600519 的股票 1 分钟数据

代码展示

获取当日分钟线数据

from urllib.parse import urlencodeimport pandas as pdimport requests

def gen_secid(rawcode: str) -> str: ''' 生成东方财富专用的secid
Parameters ---------- rawcode : 6 位股票代码
Return ------ str: 指定格式的字符串
''' # 沪市指数 if rawcode[:3] == '000': return f'1.{rawcode}' # 深证指数 if rawcode[:3] == '399': return f'0.{rawcode}' # 沪市股票 if rawcode[0] != '6': return f'0.{rawcode}' # 深市股票 return f'1.{rawcode}'

def get_k_history(code: str, beg: str = '16000101', end: str = '20500101', klt: int = 1, fqt: int = 1) -> pd.DataFrame: ''' 功能获取k线数据
Parameters ---------- code : 6 位股票代码 beg: 开始日期 例如 20200101 end: 结束日期 例如 20200201 klt: k线间距 默认为 101 即日k klt:1 1 分钟 klt:5 5 分钟 klt:101 日 klt:102 周 fqt: 复权方式 不复权 : 0 前复权 : 1 后复权 : 2 Return ------ DateFrame : 包含股票k线数据 ''' EastmoneyKlines = { 'f51': '日期', 'f52': '开盘', 'f53': '收盘', 'f54': '最高', 'f55': '最低', 'f56': '成交量', 'f57': '成交额', 'f58': '振幅', 'f59': '涨跌幅', 'f60': '涨跌额', 'f61': '换手率',

} EastmoneyHeaders = { 'Host': '19.push2.eastmoney.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko', 'Accept': '*/*', 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'Referer': 'http://quote.eastmoney.com/center/gridlist.html', } fields = list(EastmoneyKlines.keys()) columns = list(EastmoneyKlines.values()) fields2 = ",".join(fields) secid = gen_secid(code) params = ( ('fields1', 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13'), ('fields2', fields2), ('beg', beg), ('end', end), ('rtntype', '6'), ('secid', secid), ('klt', f'{klt}'), ('fqt', f'{fqt}'), ) params = dict(params) base_url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get' url = base_url+'?'+urlencode(params) json_response: dict = requests.get( url, headers=EastmoneyHeaders).json()
data = json_response.get('data') if data is None: if secid[0] == '0': secid = f'1.{code}' else: secid = f'0.{code}' params['secid'] = secid url = base_url+'?'+urlencode(params) json_response: dict = requests.get( url, headers=EastmoneyHeaders).json() data = json_response.get('data') if data is None: print('股票代码:', code, '可能有误') return pd.DataFrame(columns=columns)
klines = data['klines']
rows = [] for _kline in klines:
kline = _kline.split(',') rows.append(kline)
df = pd.DataFrame(rows, columns=columns)
return df

if __name__ == "__main__": # 股票代码 code = '600519' # 根据股票代码、开始日期、结束日期获取指定股票代码指定日期区间的k线数据 df = get_k_history(code) # 保存k线数据到表格里面 df.to_csv(f'{code}.csv', encoding='utf-8-sig', index=None) print(f'股票代码:{code} 的 k线数据已保存到代码目录下的 {code}.csv 文件中')

获取当日分钟线数据(每分钟运行一次,直到收盘)

from urllib.parse import urlencodeimport pandas as pd


    
import requestsimport time

def gen_secid(rawcode: str) -> str: ''' 生成东方财富专用的secid
Parameters ---------- rawcode : 6 位股票代码
Return ------ str: 指定格式的字符串
''' # 沪市指数 if rawcode[:3] == '000': return f'1.{rawcode}' # 深证指数 if rawcode[:3] == '399': return f'0.{rawcode}' # 沪市股票 if rawcode[0] != '6': return f'0.{rawcode}' # 深市股票 return f'1.{rawcode}'

def get_k_history(code: str, beg: str = '16000101', end: str = '20500101', klt: int = 1, fqt: int = 1) -> pd.DataFrame: ''' 功能获取k线数据
Parameters ---------- code : 6 位股票代码 beg: 开始日期 例如 20200101 end: 结束日期 例如 20200201 klt: k线间距 默认为 101 即日k klt:1 1 分钟 klt:5 5 分钟 klt:101 日 klt:102 周 fqt: 复权方式 不复权 : 0 前复权 : 1 后复权 : 2 Return ------ DateFrame : 包含股票k线数据 ''' EastmoneyKlines = { 'f51': '日期', 'f52': '开盘', 'f53': '收盘', 'f54': '最高', 'f55': '最低', 'f56': '成交量', 'f57': '成交额', 'f58': '振幅', 'f59': '涨跌幅', 'f60': '涨跌额', 'f61': '换手率',

} EastmoneyHeaders = { 'Host': '19.push2.eastmoney.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko', 'Accept': '*/*', 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'Referer': 'http://quote.eastmoney.com/center/gridlist.html', } fields = list(EastmoneyKlines.keys()) columns = list(EastmoneyKlines.values()) fields2 = ",".join(fields) secid = gen_secid(code) params = ( ('fields1', 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13'), ('fields2', fields2), ('beg', beg), ('end', end), ('rtntype', '6'), ('secid', secid), ('klt', f'{klt}'), ('fqt', f'{fqt}'), ) params = dict(params) base_url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get' url = base_url+'?'+urlencode(params) json_response: dict = requests.get( url, headers=EastmoneyHeaders).json()
data = json_response.get('data') if data is None: if secid[0] == '0': secid = f'1.{code}' else: secid = f'0.{code}' params['secid'] = secid url = base_url+'?'+urlencode(params) json_response: dict = requests.get( url, headers=EastmoneyHeaders).json() data = json_response.get('data') if data is None: print('股票代码:', code, '可能有误') return pd.DataFrame(columns=columns)
klines = data['klines']
rows = [] for _kline in klines:
kline = _kline.split(',') rows.append(kline)
df = pd.DataFrame(rows, columns=columns)
return df

if __name__ == "__main__": # 重复 1000 次 for _ in range(1000): # 股票代码 code = '600519' # 根据股票代码、开始日期、结束日期获取指定股票代码指定日期区间的k线数据 df = get_k_history(code) # 保存k线数据到表格里面 df.to_csv(f'{code}.csv', encoding='utf-8-sig', index=None) print(f'股票代码:{code} 的 k线数据已保存到代码目录下的 {code}.csv 文件中')
# 240 行说明收盘了,结束 if len(df) >= 240: print('已收盘') break time.sleep(60)

运行环境说明

Python版本要求

Python 3

需要安装的库

pandas
requests

库的安装方法是:打开 cmd(命令提示符或者其他终端工具),输入以下代码

pip install pandas requests

输入完毕,按 Enter 键执行代码,等待 successfully 出现即可

原文链接:zhihu.com/question/438404653/answer/1794419766

文章转载:Python编程学习圈
(版权归原作者所有,侵删)

点击下方“阅读原文”查看更多

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/120116
 
2691 次点击