Python量化实战:用“Tushare”接口抓取北向资金数据并构建选股策略
随着金融市场的不断发展和科技的进步,量化投资逐渐成为投资者的重要工具。Python作为一门功能强大且易于上手的编程语言,已经成为量化投资领域的主流工具之一。本文将介绍如何使用 Python 的 Tushare 接口获取北向资金数据,并基于该数据构建一个简单的选股策略。
一、什么是北向资金?
北向资金是指通过“沪港通”和“深港通”机制,从香港市场流入中国大陆A股市场的外资。由于这些资金通常来自国际机构投资者,具有较强的市场敏感性和投资能力,因此北向资金的流向常常被视为市场风向标。
二、Tushare 简介
Tushare 是一个免费、开源的金融数据接口平台,提供包括股票、基金、期货、外汇等多类金融数据。用户可以通过简单的 Python API 调用获取所需数据,非常适合用于量化分析和策略回测。
安装与配置
首先,确保你已经安装了 Tushare:
pip install tushare然后注册 Tushare 账号并获取 token,在代码中进行初始化:
import tushare as ts ts.set_token(‘你的token’) # 替换为你的Tushare Token pro = ts.pro_api()三、获取北向资金数据
Tushare 提供了多个接口用于获取北向资金相关数据。我们主要使用以下两个接口:
moneyflow_hsgt:获取沪深港通每日资金流向 hsgt_top10:获取每日北向资金十大成交股1. 获取资金流向数据
# 获取最近一年的沪深港通资金流向数据 df_flow = pro.moneyflow_hsgt(start_date=’20230101′, end_date=’20240101′) print(df_flow.head())输出示例:
trade_datenorth_moneysouth_moneyhk_hold_stock… 2023010358.2312.452.34…其中 north_money 表示当日北向资金净流入金额(单位:亿元)。
2. 获取北向资金前十大成交股
# 获取2023年1月3日的北向资金十大成交股 df_top10 = pro.hsgt_top10(trade_date=’20230103′, market_type=’1′) # market_type=’1′ 表示沪股通 print(df_top10)输出示例:
trade_datets_codenamenorth_net… 20230103600519.SH贵州茅台5.23…四、构建选股策略
策略思路
我们构建一个基于北向资金动向的简单选股策略:
筛选条件: 某只股票连续3个交易日出现在北向资金成交前十; 北向资金净买入金额连续上升; 买卖逻辑: 若满足条件,则在第4日开盘买入; 持有5个交易日,然后卖出。1. 数据处理
首先,我们获取一段时间内的北向资金十大成交股,并进行整理:
import pandas as pd # 获取一段时间内的北向资金十大成交股数据 trade_dates = pro.trade_cal(exchange=”, start_date=’20230101′, end_date=’20230131′, is_open=’1′) trade_dates = trade_dates[‘cal_date’].tolist() all_top10 = pd.DataFrame() for date in trade_dates: df = pro.hsgt_top10(trade_date=date, market_type=’1′) # 沪股通 df[‘trade_date’] = date all_top10 = pd.concat([all_top10, df], ignore_index=True) # 保留北向资金净买入的股票 all_top10 = all_top10[all_top10[‘north_net’] > 0]2. 构建信号
接下来,我们找出连续3天出现在北向资金十大成交股中的股票:
# 将数据按股票代码和交易日期排序 all_top10 = all_top10.sort_values([‘ts_code’, ‘trade_date’]) # 创建一个字典来记录每只股票连续出现的天数 stock_consecutive = {} signals = [] for i, row in all_top10.iterrows(): code = row[‘ts_code’] date = row[‘trade_date’] if code not in stock_consecutive: stock_consecutive[code] = [date] else: stock_consecutive[code].append(date) # 找出连续出现3天的股票 for code, dates in stock_consecutive.items(): for i in range(len(dates) – 2): d1 = dates[i] d2 = dates[i+1] d3 = dates[i+2] # 简单判断是否连续三天(实际应考虑交易日顺序) signals.append({ ‘ts_code’: code, ‘buy_date’: d3 # 第四天买入 }) signals_df = pd.DataFrame(signals) print(signals_df.head())3. 获取股票行情并计算收益
接下来,我们可以使用 pro.daily 接口获取股票行情,并计算持有5天的收益:
def get_stock_return(code, buy_date): df = pro.daily(ts_code=code, start_date=buy_date) if df.empty: return None df = df.sort_values(‘trade_date’) df[‘trade_date’] = pd.to_datetime(df[‘trade_date’]) df = df.reset_index(drop=True) if len(df) < 5: return None buy_price = df.loc[0, ‘open’] sell_price = df.loc[4, ‘close’] return (sell_price – buy_price) / buy_price # 计算每只股票的收益 returns = [] for _, row in signals_df.iterrows(): code = row[‘ts_code’] buy_date = row[‘buy_date’] ret = get_stock_return(code, buy_date) if ret is not None: returns.append({ ‘ts_code’: code, ‘buy_date’: buy_date, ‘return’: ret }) returns_df = pd.DataFrame(returns) avg_return = returns_df[‘return’].mean() print(f”平均收益率:{avg_return:.2%}”)五、策略优化与拓展
上述策略只是一个基础的实现,实际应用中可以进一步优化:
引入更多因子: 增加成交量、换手率、财务指标等辅助判断; 加入止损机制: 设置止损点以控制回撤; 多因子组合策略: 将北向资金动向与其他因子(如动量、估值)组合使用; 回测框架: 使用如 Backtrader、PyAlgoTrade 等框架进行完整回测; 多市场覆盖: 同时分析深股通、港股通等资金流向。六、总结
本文介绍了如何使用 Tushare 获取北向资金数据,并基于该数据构建了一个简单的选股策略。通过 Python 编程和金融数据接口的结合,我们可以快速实现从数据获取到策略构建的全过程。
虽然本文的策略较为基础,但其思路可以作为进一步深入量化投资研究的起点。未来可以结合机器学习、大数据分析等方法,进一步提升策略的稳定性和收益表现。
附录:完整代码汇总
本文所用代码片段已整合成完整脚本,可访问 GitHub 或联系作者获取。
如果你对量化投资、Python 金融分析感兴趣,欢迎关注我的后续文章,我们将继续深入探讨更多实战策略和模型构建方法。