最近一直有同学问akshare怎么行情数据接口ip被封了,有什么更好的替代呢。其实这个问题我之前回答过很多遍了。 比如换成miniqmt, 或者换成tushare。
毕竟现在东方财富封ip的规则比之前严格多了, 不是太推荐用东方财富的数据源。
但是一些同学既不想花钱买tushare(虽然几百块1年不算太贵),也不想开户miniqmt(低门槛入金10w就可以搞定), 尽管我知道还有其他付费的接口途径, 鉴于 需要免费的心理我就不继续推荐了。 虽然有些时候免费的其实是最贵的道理 ,耗费更多的时间精力。 对于我来说, 又多了一个聊聊技术的素材哈。
既然东方财富用不了,那就把接口无缝迁移到新浪、 腾讯等接口呗。办法总比困难多。
接口: stock_zh_a_daily
P.S. 建议切换为 stock_zh_a_hist 接口使用(该接口数据质量高, 访问无限制)
目标地址: https://finance.sina.com.cn/realstock/company/sh600006/nc.shtml(示例)
描述: 新浪财经-沪深京 A 股的数据, 历史数据按日频率更新; 注意其中的 sh689009 为 CDR, 请 通过 ak.stock_zh_a_cdr_daily 接口获取
限量: 单次返回指定沪深京 A 股上市公司指定日期间的历史行情日频率数据, 多次获取容易封禁 IP
输入参数
名称 | 类型 | 描述 |
|---|---|---|
symbol | str | symbol='sh600000'; 股票代码可以在 ak.stock_zh_a_spot() 中获取 |
start_date | str | start_date='20201103'; 开始查询的日期 |
end_date | str | end_date='20201116'; 结束查询的日期 |
adjust | str | 默认返回不复权的数据; qfq: 返回前复权后的数据; hfq: 返回后复权后的数据; hfq-facto |
需要注意的是, 新浪的行情数据接口没有涨跌幅字段, 那我们用pandas的内置函数pct_change。
df.pct_change() DataFrame.pct_change(periods=1, fill_method=‘pad’, limit=None, freq=None, **kwargs) 表示当前元素与先前元素的相差百分比,当然指定periods=n,表示当前元素与先前n 个元素的相差百分比。
import akshare as ak
import pandas as pd
def get_stock_zh_a_daily(stock_code, start_date, end_date, adjust=''):
if stock_code.startswith('6'):
stock_code = "sh" + stock_code
else:
stock_code = "sz" + stock_code
df = ak.stock_zh_a_daily(
symbol=stock_code,
start_date=start_date,
end_date=end_date,
adjust=adjust
)
column_mapping = {
'date': '日期',
'open': '开盘',
'close': '收盘',
'high': '最高',
'low': '最低',
'volume': '成交量',
'amount': '成交额',
'change_rate': '涨跌幅',
'turnover':'换手率',
'outstanding_share':'流通股本'
}
# 选择你需要的列并重命名
df.rename(columns=column_mapping, inplace=True)
# 转换日期格式为 datetime 类型
df['日期'] = pd.to_datetime(df['日期'])
df['涨跌幅'] = df['收盘'].pct_change() * 100
return df
if __name__ == '__main__':
symbol = '600000'
start_date = '20250101'
end_date = '20251024'
df = get_stock_zh_a_daily(symbol, start_date, end_date)
print(df)如果我的分享对你投资有所帮助,不吝啬给个点赞关注呗。 这个号主要分享AI量化技术相关, 当天的灵感相关记录,相对比较杂。