

最近有同学问我,之前实现的量化分析基本用akshare的ak.stock_zh_a_hist方法,最近抓取东方财富经常出现问题,sleep了还是被拒绝,这种情况一般是ip被封了。 能否在改动少量的代码情况下,实现行情无缝切换到tushare。
其实这个需求很简单, 我之前封装过。 要不我把之前封装的代码分享一下,以便有需求的同学。 其实 改用 miniqmt等也可以用类似的思路。 我们可以通过开关选择对应的数据源, 或者用备用冗杂处理数据源。
这里庖丁解牛分析下实现的步骤,大概有4个步骤
1、数据源初始化和认证
比如你用tushare, 先到官网去注册账号
import tushare as ts
# 替换 'YOUR_API_TOKEN' 为你在Tushare官网获取的实际token
ts.set_token('YOUR_API_TOKEN') pro = ts.pro_api()
2、转换股票代码
Tushare 要求代码包含交易所后缀。你需要一个简单的转换函数。
3、获取历史行情数据
从akshare获取的行情数据改为tushare获取行情数据
4、列名映射与数据清洗
直接获取tushare返回得到的数据框列名,和akshare肯定是不同的,需要映射到你所熟悉的AKShare列名。
这样一看,你想把akshare换成miniqmt 封装是不是类似的思路。
这里贴一下完整代码,参考下思路, 具体根据自己的实际情况改造。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。 希望我的分享对大家有所帮助
import akshare as ak
import tushare as ts
import pandas as pd
def convert_to_tushare_code(ak_share_code):
"""
将 AKShare 的股票代码(如'600519')转换为 Tushare 格式(如'600519.SH')
简单的判断规则:6开头为上证(SH),0或3开头为深证(SZ)
"""
if ak_share_code.startswith('6'):
return ak_share_code + '.SH'
elif ak_share_code.startswith('0') or ak_share_code.startswith('3'):
return ak_share_code + '.SZ'
elif ak_share_code.startswith('8') or ak_share_code.startswith('9'):
return ak_share_code + '.BJ'
else:
raise ValueError(f"无法识别的股票代码: {ak_share_code}")
def stock_zh_a_hist_tushare(stock_code, start_date, end_date, adjust):
ts.set_token('XXXXX')
pro = ts.pro_api()
df = pro.daily(ts_code= convert_to_tushare_code(stock_code), start_date=start_date, end_date=end_date, adjust=adjust)
df = df.sort_values('trade_date').reset_index(drop=True)
# 列名映射字典
column_mapping = {
'trade_date': '日期',
'open': '开盘',
'high': '最高',
'low': '最低',
'close': '收盘',
'vol': '成交量',
'amount': '成交额',
'pct_chg': '涨跌幅'
}
# 选择你需要的列并重命名
df.rename(columns=column_mapping, inplace=True)
# 转换日期格式为 datetime 类型
df['日期'] = pd.to_datetime(df['日期'])
return df
if __name__ == "__main__":
stock_code = '600519'
start_date = '20250101'
end_date = '20250926'
# df1 = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date, end_date=end_date, adjust="qfq")
# print(df1.head(10))
df2 = stock_zh_a_hist_tushare(stock_code=stock_code, start_date=start_date, end_date=end_date, adjust='qfq')
print(df2.head(10))如果我的分享对你投资有所帮助,不吝啬给个点赞关注呗。