
为什么量化选股离不开股票API接口
普通散户炒股靠感觉,量化交易者靠数据。数据从哪里来?股票API接口。它就像一根水管,把交易所的实时行情、历史K线、财务指标源源不断输送到你的策略代码里。没有这个接口,再聪明的策略也是无米之炊。
股票API接口分两类。一类是券商提供的交易接口,用来下单、查持仓。另一类是数据接口,像Tushare、BaoStock、Yahoo Finance,提供历史价格、成交量、市盈率等。量化选股主要用数据接口,先把股票池筛一遍,再决定买卖哪些。
期货市场同样如此。商品期货、股指期货的量化策略也依赖API获取行情。期货有杠杆、T+0、双向交易,策略逻辑和股票略有不同,底层数据接口的用法大同小异。
下面聊五个最常见的量化选股策略。每个策略都配一段Python代码,演示如何通过股票API接口拉数据、算信号。代码用pandas和tushare,你换成其他接口也能跑。

策略一 均线交叉 最经典的趋势跟踪
均线交叉策略的逻辑一句话就能说清:短期均线上穿长期均线买入,下穿卖出。比如5日均线和20日均线。5日线代表最近一周的平均成本,20日线代表最近一个月的平均成本。短期线上穿长期线,说明近期买盘力量增强,趋势可能向上。
这个策略在趋势明显的股票上表现好,在震荡市里会反复被打脸。期货市场用均线交叉更普遍,因为期货趋势性强,而且可以做空。
用股票API接口实现很简单。拉取某只股票过去60天的收盘价,计算5日和20日移动平均,找出交叉点。
import tushare as ts
import pandas as pd
# 初始化接口
ts.set_token('你的token')
pro = ts.pro_api()
# 获取平安银行日线数据
df = pro.daily(ts_code='000001.SZ', start_date='20240101', end_date='20240401')
df = df.sort_values('trade_date')
df['ma5'] = df['close'].rolling(5).mean()
df['ma20'] = df['close'].rolling(20).mean()
# 生成信号
df['signal'] = 0
df.loc[df['ma5'] > df['ma20'], 'signal'] = 1
df.loc[df['ma5'] <= df['ma20'], 'signal'] = -1
# 找出交叉点
df['cross'] = df['signal'].diff()
buy_days = df[df['cross'] == 2]['trade_date'].tolist()
sell_days = df[df['cross'] == -2]['trade_date'].tolist()
print('买入信号', buy_days)
print('卖出信号', sell_days)
实际使用时,你会遍历整个股票池,对每只股票算一遍均线交叉,选出当前发出买入信号的股票。
策略二 动量策略 追涨杀跌也能赚钱
动量策略的核心思想是:过去涨得好的股票,未来一段时间大概率继续涨。听起来反常识,但学术界和实战都验证过。行为金融学解释为“反应不足”和“羊群效应”。
具体做法:每月月初,计算所有股票过去20个交易日的收益率,买入排名前10%的股票,持有到月底再换。期货市场里,动量策略常用于商品期货,做多近期强势品种,做空近期弱势品种。
用API接口拉全市场股票的月度收益率,排序选股。
# 获取所有股票列表
stocks = pro.stock_basic(exchange='', list_status='L', fields='ts_code')
# 计算每只股票过去20日收益率
results = []
for code in stocks['ts_code'][:100]: # 演示取前100只
df = pro.daily(ts_code=code, start_date='20240201', end_date='20240301')
if len(df) < 20:
continue
ret = df['close'].iloc[0] / df['close'].iloc[-1] - 1
results.append((code, ret))
# 按收益率排序
results.sort(key=lambda x: x[1], reverse=True)
top_stocks = results[:10]
print('动量前10', top_stocks)
动量策略在牛市里效果拔群,在熊市里会亏得很快。需要配合止损规则,比如个股回撤超过10%就卖出。
策略三 均值回归 抓超跌反弹
均值回归和动量策略正好相反。它假设股票价格短期内涨太多或跌太多,最终会回到平均水平。常用指标是布林带、RSI、乖离率。
布林带由三条线组成:中轨是20日均线,上轨是中轨加2倍标准差,下轨是中轨减2倍标准差。价格跌破下轨,说明短期超卖,可能反弹。价格突破上轨,说明超买,可能回调。
均值回归策略适合震荡市,不适合单边趋势。期货市场里,螺纹钢、豆粕等品种经常出现均值回归机会。
用API接口计算布林带,选出当前价格低于下轨的股票。
# 获取某只股票数据
df = pro.daily(ts_code='600519.SH', start_date='20240101', end_date='20240401')
df = df.sort_values('trade_date')
# 计算布林带
df['ma20'] = df['close'].rolling(20).mean()
df['std'] = df['close'].rolling(20).std()
df['upper'] = df['ma20'] + 2 * df['std']
df['lower'] = df['ma20'] - 2 * df['std']
# 选出价格低于下轨的交易日
df['buy_signal'] = df['close'] < df['lower']
print(df[df['buy_signal']][['trade_date', 'close', 'lower']])
实际选股时,你会扫描全市场,找出所有价格跌破下轨的股票。注意,均值回归不能无脑买,要结合基本面排除掉真正有问题的公司。
策略四 多因子选股 机构最爱的系统化方法
多因子模型把股票收益拆解成多个因子。常见因子有:估值因子(市盈率、市净率)、成长因子(营收增速、利润增速)、质量因子(ROE、毛利率)、动量因子、波动率因子。
做法:给每个因子打分,加权求和,选出综合得分最高的股票。比如,市盈率越低得分越高,ROE越高得分越高。权重可以等权,也可以用历史数据优化。
期货市场也有多因子,比如展期收益率、库存因子、基差因子。
用API接口拉财务数据和行情数据,合成因子。
# 获取基本面数据
fund = pro.fina_indicator(ts_code='000001.SZ', start_date='20230101', end_date='20231231')
# 获取行情数据
daily = pro.daily(ts_code='000001.SZ', start_date='20240101', end_date='20240401')
# 合成因子:低市盈率+高ROE
pe = daily['close'].iloc[-1] / fund['eps'].iloc[0]
roe = fund['roe'].iloc[0]
score = -pe + roe # 简单加权,具体权重需回测
print('综合得分', score)
多因子选股是量化私募的主流方法,但需要大量历史数据回测,避免过拟合。
策略五 配对交易 市场中性策略
配对交易找两只历史走势高度相关的股票,比如工商银行和建设银行。当价差偏离历史均值时,做多低估的,做空高估的,等价差回归后平仓。
这个策略在股票和期货市场都适用。期货里,配对交易常用在螺纹钢和热卷、豆油和棕榈油之间。
用API接口计算两只股票的价差,设定开仓阈值。
# 获取两只银行股数据
df1 = pro.daily(ts_code='601398.SH', start_date='20240101', end_date='20240401')
df2 = pro.daily(ts_code='601939.SH', start_date='20240101', end_date='20240401')
# 合并数据
df1 = df1.sort_values('trade_date')
df2 = df2.sort_values('trade_date')
merged = pd.merge(df1[['trade_date', 'close']], df2[['trade_date', 'close']], on='trade_date', suffixes=('_icbc', '_ccb'))
merged['spread'] = merged['close_icbc'] - merged['close_ccb']
merged['mean'] = merged['spread'].rolling(20).mean()
merged['std'] = merged['spread'].rolling(20).std()
merged['zscore'] = (merged['spread'] - merged['mean']) / merged['std']
# zscore > 2 做空价差,zscore < -2 做多价差
print(merged[['trade_date', 'spread', 'zscore']].tail())
配对交易的风险在于,历史相关性可能突然断裂。比如一家银行爆出坏账,价差再也不回归。所以需要定期重新筛选配对。
股票和期货量化选股的差异
股票API接口和期货API接口用法相似,但策略细节不同。股票是T+1,当天买入不能卖出,所以日内策略受限。期货是T+0,可以当天多次开平仓。股票只能做多,期货可以做空。股票没有杠杆,期货有杠杆,仓位管理更严格。
均线交叉和动量策略在期货上更常用,因为期货趋势性强。均值回归和配对交易在股票上更常见。多因子模型两者通用。
选择策略时,先看市场特性。股票市场散户多,动量效应明显。期货市场机构多,均值回归更普遍。
落地建议 先模拟后实盘
用股票API接口写策略,第一步是跑历史回测。看策略在过去几年赚不赚钱,最大回撤多少。第二步是模拟交易,用实时数据跑,但不投真钱。第三步才是小资金实盘。
回测要小心未来函数。比如,用当天收盘价算信号,却假设当天开盘价成交,这是作弊。实际交易中,收盘后算信号,第二天开盘才能下单。
接口稳定性很重要。免费接口经常限流、断连。做高频策略,需要付费的Level-2数据。做日线级别策略,免费接口够用。
量化选股不是圣杯。任何策略都有失效的时候。多策略组合,分散风险,才是长期生存之道。