Python获取全部A股股票日K线基础数据,来自某财。
看到网站上很多人在找,曾经因为自己也为此苦恼过, 所以希望能提供一点点帮助。
数据格式如下:
| 名称 | 类型 | 描述 |
| 日期 | object | 交易日 |
| 股票代码 | object | 不带市场标识的股票代码 |
| 开盘 | float64 | 开盘价 |
| 收盘 | float64 | 收盘价 |
| 最高 | float64 | 最高价 |
| 最低 | float64 | 最低价 |
| 成交量 | int64 | 注意单位: 手 |
| 成交额 | float64 | 注意单位: 元 |
| 振幅 | float64 | 注意单位: % |
| 涨跌幅 | float64 | 注意单位: % |
| 涨跌额 | float64 | 注意单位: 元 |
| 换手率 | float64 | 注意单位: % |
以下是Python代码,网站封IP是肯定的,和程序没关系,自个调整吧。
# !/usr/bin/env python
# coding=utf-8
import gc
import random
import time
from urllib.parse import urlencode
import akshare as ak
import pandas as pd
import requests
def get_k_history(stock_code):
"""
功能获取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线数据
"""
# 开始和结束时间设置的比较夸张,为了下全数据
beg = '19700101'
end = "22240101"
klt = 101 # 日线数据
fqt = 1 # 前复权
EastmoneyKlines = {'f51': 'date', 'f52': 'open', 'f53': 'close', 'f54': 'high', 'f55': 'low', 'f56': 'volume',
'f57': 'amount', 'f58': 'AMP', 'f59': 'pctChg', 'f60': 'prcChg', 'f61': 'turn', }
EastmoneyHeaders = {'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)
market_code = 1 if stock_code.startswith("6") else 0
params = (
('fields1', 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13'), ('fields2', fields2), ('beg', beg), ('end', end),
('rtntype', '6'), ('secid', f"{market_code}.{stock_code}"), ('klt', f'{klt}'), ('fqt', f'{fqt}'),)
base_url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get'
url = base_url + '?' + urlencode(params)
while True:
try:
response = requests.get(url, headers=EastmoneyHeaders, timeout=50)
if response.status_code == 200:
print("Stock Base Data Requested successfully.")
break
else:
print(f"Unexpected status code: {response.status_code}")
time.sleep(random.randint(1, 3))
except (requests.exceptions.ReadTimeout, requests.exceptions.ConnectTimeout) as e:
print("Error:", e)
time.sleep(random.randint(1, 3))
json_response = response.json()
if json_response is None:
print("JSON响应为空")
return
else:
data = json_response.get('data')
if data is None:
print("未找到 'data' 键")
return
else:
name = data.get('name')
if name is None:
print("未找到 'name' 键")
return
klines = data['klines']
rows = []
for _kline in klines:
kline = _kline.split(',')
rows.append(kline)
df_dk = pd.DataFrame(rows, columns=columns)
if len(df_dk) < 1:
print(stock_code, name, "没有数据。。。。。。")
return
code_column_data = pd.Series(stock_code, index=df_dk.index)
df_dk.insert(loc=1, column='code', value=code_column_data)
name_column_data = pd.Series(name, index=df_dk.index)
df_dk.insert(loc=2, column='name', value=name_column_data)
# 保存文件的路径, 自行调整
file_name = f"D:\\stockdata\\stockbase\\{stock_code}.csv"
df_dk.to_csv(file_name, mode="w", header=True, encoding="gbk", index=False)
# 小内存机器,建议保留以下两行,减少内存占用
del df_dk
# 手动触发垃圾回收
gc.collect()
# time.sleep(random.randint(1, 3))
return
if __name__ == '__main__':
start_time = time.time()
# 获取上市A股清单
df_list = ak.stock_info_a_code_name()
for cnt in range(len(df_list)):
code = df_list.iloc[cnt]['code']
name = df_list.iloc[cnt]['name']
print(cnt, code, name)
get_k_history(code)
end_time = time.time()
# 计算运行时长
duration = end_time - start_time
print("运行时长:", duration)

