企业微信

那个曾经写进代码里的接口,真的没了

不少老股民和量化新手在翻看旧代码时,发现里面藏着一个叫 ChinaStockWebService 的接口。用过的都知道,它当年是免费拿A股行情、财务数据的一个方便入口。现在去调它,返回的只有超时或者报错。没错,这个接口已经关闭了,而且关闭了相当长一段时间。

这件事本身不复杂,但它背后牵扯出一个更实际的问题:股票和期货的数据接口,为什么总在变?普通人做量化、盯盘、写策略,到底该从哪里拿数据?

接口为什么会关掉

ChinaStockWebService 早期是个人开发者或者小团队维护的公开数据服务。它把从交易所、财经网站抓来的数据包装成简单的WebService,让用户通过SOAP协议调用。那个年代,Python的pandas还没有现在这么普及,很多做金融数据的人用Java或者C#,WebService是标准做法。

这种个人接口的命门很明显:服务器成本自己扛,数据源一被限制就得跟着改,法律风险也逐年增加。2015年之后,交易所和监管对数据版权的管理越来越严,爬虫抓取公开数据再对外提供,很容易踩线。维护者要么主动关停,要么转向付费。ChinaStockWebService 属于前者,在某个时间点悄无声息地停了,没有公告,没有替代品。

ChinaStockWebService接口关闭了吗?股票期货数据获取还有哪些替代方案

股票期货数据现在从哪里来

做股票和期货,数据分几个层次。最基础的是实时行情,稍深一点是历史K线,再往上是财务数据、资金流向、期货持仓排名。不同层次的数据,获取方式不一样。

免费且稳定的几个选择

Tushare 是现在散户和量化爱好者用得最多的。它从最早的免费接口变成了积分制,基础数据免费,高频或者特殊数据需要积分。注册后拿到token,一行代码就能取日线、分钟线、期货主力合约。它的股票接口覆盖了基本面、行情、龙虎榜。期货方面有主力合约和连续合约,日线数据完整。

AkShare 是另一个完全免费的库。它不依赖注册,直接爬取各大公开财经网站的数据,股票、期货、期权、基金、外汇都有。优点是数据全,更新快。缺点是偶尔会因为目标网站改版而失效,但作者更新很勤。对于股票和期货的日线、分钟线、持仓排名,AkShare 基本够用。

Baostock 提供历史K线,免费无注册,数据质量不错,适合做回测。它不提供实时行情,但历史数据干净,复权处理准确。股票和期货的日线、周线、月线都能拿。

券商和期货公司的官方接口

如果你有股票账户,很多券商提供量化交易接口,比如华泰、国金、中泰。这些接口需要资金门槛,通常50万起步,但数据质量高,交易直连。期货方面,CTP接口是行业标准,通过期货公司开通,能拿到实时行情和交易权限。门槛比股票低,几万块就能开。

付费数据服务

Wind、同花顺iFinD、东方财富Choice是机构用的。个人买很贵,一年几万到几十万。但数据全面,清洗干净,适合专业策略。

接口变了,策略怎么办

很多人写策略时把数据获取写死在代码里,接口一关,整个策略跑不起来。正确的做法是把数据层和策略层分开。用一个统一的DataFeed类封装所有数据源,切换数据源时只改这一个类,策略逻辑不动。

下面是一个简单的Python示例,用AkShare获取股票和期货数据,封装成统一格式。


import akshare as ak

import pandas as pd

class DataFeed:

    def get_stock_daily(self, symbol, start, end):

        df = ak.stock_zh_a_hist(symbol=symbol, period="daily", start_date=start, end_date=end, adjust="qfq")

        df = df.rename(columns={

            "日期": "date", "开盘": "open", "收盘": "close",

            "最高": "high", "最低": "low", "成交量": "volume"

        })

        df["date"] = pd.to_datetime(df["date"])

        df = df.set_index("date").sort_index()

        return df[["open", "high", "low", "close", "volume"]]

    def get_futures_daily(self, symbol, start, end):

        df = ak.futures_zh_daily_sina(symbol=symbol)

        df = df.rename(columns={

            "date": "date", "open": "open", "close": "close",

            "high": "high", "low": "low", "volume": "volume"

        })

        df["date"] = pd.to_datetime(df["date"])

        df = df.set_index("date").sort_index()

        df = df.loc[start:end]

        return df[["open", "high", "low", "close", "volume"]]

feed = DataFeed()

stock_data = feed.get_stock_daily("000001", "20240101", "20240401")

futures_data = feed.get_futures_daily("RB0", "20240101", "20240401")

print(stock_data.tail())

print(futures_data.tail())

这样写的好处是,未来AkShare不能用了,换Tushare或者Baostock,只需要改DataFeed里面的实现,策略回测和实盘代码完全不用动。

期货数据比股票数据更麻烦吗

期货数据有它的特殊性。股票就一个现货市场,期货有多个合约月份,还有主力合约换月的问题。ChinaStockWebService 当年对期货支持很弱,几乎只能拿股票。现在做期货量化,AkShare和Tushare都能拿主力合约和连续合约,但要注意换月规则。

主力合约的拼接方式直接影响回测结果。有的平台用成交量最大作为主力,有的用持仓量最大。换月时价格跳空,如果不做复权处理,均线策略会发出错误信号。Tushare的期货主力合约已经做了拼接,直接可用。AkShare的futures_main_sina也做了类似处理,但细节需要自己检查。

数据获取的底线思维

不要依赖单一免费接口。免费接口的维护者没有义务一直提供服务,关停是常态。做量化的人手里至少要有两个可切换的数据源。股票用AkShare加Tushare,期货用AkShare加CTP仿真。回测用Baostock的历史数据做交叉验证。

接口关闭不是灾难,没有备份方案才是。把数据层抽象出来,保持接口可替换,策略的生命周期会长很多。