个人AI项目的“数据源求生指南”——Tushare限流、AKShare补位、本地缓存实战
做AI金融产品,数据源是第一道坎。Tushare免费版1次/小时,开发调试时直接卡死。换AKShare,换手率又拿不到。最后我总结了一套“主备切换+本地缓存”的生存方案。
坑1:Tushare限流——1次/小时,开发等于“等死”
Tushare免费版积分只有128分,调用频率限制1次/小时。本地开发调试时,每次改完代码想重新拉数据测试,都得等一个小时。
根本原因:
Tushare的积分等级决定了调用频率。免费版积分低,不仅频率受限,很多核心数据(如PE/PB)需要2000积分才能拿。
解决方案:AKShare作为补充数据源
AKShare是开源免费的金融数据接口库,不需要积分,直接调用就能拿数据。
import akshare as ak
# AKShare获取PE/PB数据(无积分门槛)
stock_pe_pb = ak.stock_a_pe_pb()
# 获取行情数据
stock_zh_a_hist = ak.stock_zh_a_hist(
symbol="000001",
period="daily",
start_date="20230101",
end_date="20241231"
)
坑2:AKShare换手率拿不到——有些数据就是没有
换用AKShare后,PE/PB正常拿到了,但换手率一直是None。查了半天发现是东方财富接口网络不通。
解决思路:
不是所有数据都必须拿到。换手率对模型来说是次要特征,PE/PB分位才是核心。在资源有限的情况下,保核心特征比追求全面更重要。
最终方案:主备切换 + 本地缓存
import akshare as ak
import json
from datetime import datetime
class DataSourceManager:
def __init__(self):
self.cache_file = "data_cache.json"
self.cache = self.load_cache()
def get_pe_pb_data(self, stock_code):
# 1. 先尝试Tushare
try:
data = pro.daily_basic(ts_code=stock_code, fields='pe,pb')
if data is not None and not data.empty:
self.save_cache(stock_code, 'pe_pb', data)
return data
except Exception as e:
print(f"Tushare失败: {e}")
# 2. 备用AKShare
try:
data = ak.stock_a_pe_pb()
result = data[data['代码'] == stock_code]
if not result.empty:
self.save_cache(stock_code, 'pe_pb', result)
return result
except Exception as e:
print(f"AKShare失败: {e}")
# 3. 返回本地缓存
return self.load_cache(stock_code, 'pe_pb')
def save_cache(self, key, data_type, data):
"""缓存数据到本地JSON文件"""
if key not in self.cache:
self.cache[key] = {}
self.cache[key][data_type] = {
'data': data.to_dict(),
'timestamp': datetime.now().isoformat()
}
with open(self.cache_file, 'w') as f:
json.dump(self.cache, f)
踩坑总结:
-
个人项目不要死磕单一数据源,用“主+备”方案保证开发不卡壳。
-
不是所有数据都必须拿到。核心特征优先,次要特征可以放弃。
-
本地缓存很重要,日常拉取的数据存下来,断网也能继续开发。

浙公网安备 33010602011771号