个人AI项目的“数据源求生指南”——Tushare限流、AKShare补位、本地缓存实战

做AI金融产品,数据源是第一道坎。Tushare免费版1次/小时,开发调试时直接卡死。换AKShare,换手率又拿不到。最后我总结了一套“主备切换+本地缓存”的生存方案。

坑1:Tushare限流——1次/小时,开发等于“等死”

Tushare免费版积分只有128分,调用频率限制1次/小时。本地开发调试时,每次改完代码想重新拉数据测试,都得等一个小时。

根本原因:

Tushare的积分等级决定了调用频率。免费版积分低,不仅频率受限,很多核心数据(如PE/PB)需要2000积分才能拿。

解决方案:AKShare作为补充数据源

AKShare是开源免费的金融数据接口库,不需要积分,直接调用就能拿数据。

python
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分位才是核心。在资源有限的情况下,保核心特征比追求全面更重要。

最终方案:主备切换 + 本地缓存

python
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)

踩坑总结:

  • 个人项目不要死磕单一数据源,用“主+备”方案保证开发不卡壳。

  • 不是所有数据都必须拿到。核心特征优先,次要特征可以放弃。

  • 本地缓存很重要,日常拉取的数据存下来,断网也能继续开发。

posted @ 2026-06-26 16:16  竹雨禅月  阅读(106)  评论(0)    收藏  举报