第三章:折溢价数据获取——你得先有数据,才能谈赚钱
做折溢价套利,最怕什么?
不是行情突变,不是手续费高。
是——你根本拿不到数据。
我刚开始做LOF折溢价的时候,每天手动打开几个平台,一个一个记价格。后来发现,等你记完,行情早变了。说白了,手工操作就是给市场送钱。
这一章,我就把数据获取的几条路给你捋清楚。从最简单的网页查看,到专业的API接口,再到实时行情抓取。你根据自己的技术水平和资金量,选一条合适的路就行。
3.1 主流数据平台:零门槛,但效率有限
如果你不想写代码,或者刚开始接触LOF,那这几个平台够用了。
集思录
我个人最常用的平台。它的LOF数据板块做得相当专业。打开网站,找到「LOF套利」栏目,能看到实时折溢价率、成交量、申购限额等关键指标。
我习惯每天早上开盘前刷一遍集思录,看看哪些品种折溢价异常。嗯,这里要注意:集思录的数据有15分钟延迟,做日内短线的话,这个延迟可能会让你吃瘪。
雪球
雪球的数据更新速度比集思录快一些,但它的LOF数据展示不够集中。你得自己搜索具体基金代码,才能看到折溢价信息。
雪球有个好处——社区讨论。有时候别人已经发现了套利机会,你跟着喝口汤也行。不过别全信,我见过有人在雪球上故意放假消息,自己先跑。
天天基金
天天基金的数据偏净值类,折溢价信息藏在基金详情页里。它的优势是历史数据全,适合做回测分析。
3.2 API数据接口:半自动化,效率翻倍
当你开始频繁交易,或者想用量化策略时,手动查数据就不行了。你需要API。
Tushare
国内最知名的金融数据接口之一。它提供LOF的实时行情、历史净值、折溢价率等数据。
我几年前用Tushare做过一个折溢价监控脚本。当时踩了个坑——Tushare的积分制度。免费用户只能调取有限的数据,而且频率受限。你想想看,做折溢价套利,数据延迟几分钟,机会就没了。
# 获取LOF实时行情示例
import tushare as ts
# 设置token(需要注册获取)
ts.set_token('your_token_here')
pro = ts.pro_api()
# 获取LOF基金列表
lof_list = pro.fund_basic(market='E', fund_type='LOF')
# 获取某只LOF的实时估值
df = pro.fund_nav(ts_code='501025.SH')
print(df)
AkShare
AkShare是完全免费的,而且数据源覆盖了东方财富、新浪财经等主流平台。它的接口设计比较直观,适合Python新手。
我最近的项目就在用AkShare。说实话,它的数据质量比Tushare稍差一点,偶尔会有空值或异常值。但胜在免费,而且更新频率高。
# 使用AkShare获取LOF折溢价数据
import akshare as ak
# 获取LOF实时行情
lof_realtime = ak.fund_lof_realtime_em()
print(lof_realtime.columns)
# 筛选出折溢价率超过2%的品种
high_premium = lof_realtime[lof_realtime['溢价率'] > 2]
print(high_premium)
3.3 实时行情数据抓取:WebSocket才是终极方案
API接口再好,也是轮询模式——你得主动去问服务器要数据。而WebSocket是推送模式,服务器主动把数据推给你。
为什么这个区别重要?
做折溢价套利,尤其是高频套利,你需要在折溢价率突破阈值的那一瞬间做出反应。轮询模式最快也要1秒一次,而WebSocket可以做到毫秒级推送。
WebSocket接入方案
国内主流券商和行情服务商都提供WebSocket接口。比如东方财富的WebSocket接口,可以订阅LOF的实时行情。
# WebSocket实时行情示例(伪代码)
import websocket
import json
def on_message(ws, message):
data = json.loads(message)
# 解析折溢价数据
premium = data['premium_rate']
if abs(premium) > 2:
print(f"发现套利机会!折溢价率:{premium}%")
# 触发交易逻辑
def on_error(ws, error):
print(f"连接异常:{error}")
# 自动重连
def on_close(ws, close_status_code, close_msg):
print("连接关闭,尝试重连...")
# 重连逻辑
def on_open(ws):
# 订阅LOF行情
subscribe_msg = {
"action": "subscribe",
"code": "501025"
}
ws.send(json.dumps(subscribe_msg))
# 启动WebSocket连接
ws = websocket.WebSocketApp("wss://your_websocket_url",
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close)
ws.run_forever()
3.4 数据清洗与存储:脏数据比没数据更可怕
数据拿到了,但你能直接用吗?
不能。
我见过太多人,从API拉下来数据就直接计算折溢价率,结果算出来一个离谱的数字。为什么?因为数据里有空值、有重复值、有时间戳不对齐的问题。
常见的数据脏问题
- 空值: 某些时间点的净值数据缺失
- 重复值: 同一时间戳出现多条记录
- 异常值: 价格突然跳变(比如涨停/跌停时的数据)
- 时间戳不对齐: 基金净值和实时价格的时间戳不一致
清洗流程
我总结了一套清洗流程,你可以直接套用:
import pandas as pd
import numpy as np
def clean_lof_data(df):
# 1. 删除完全重复的行
df = df.drop_duplicates()
# 2. 处理空值
df = df.dropna(subset=['nav', 'price'])
# 3. 过滤异常值(价格超过3个标准差)
df = df[np.abs(df['price'] - df['price'].mean()) <= 3 * df['price'].std()]
# 4. 对齐时间戳(按分钟取整)
df['timestamp'] = pd.to_datetime(df['timestamp']).dt.floor('T')
# 5. 计算折溢价率
df['premium_rate'] = (df['price'] - df['nav']) / df['nav'] * 100
return df
# 使用示例
raw_data = pd.read_csv('lof_data.csv')
clean_data = clean_lof_data(raw_data)
存储方案
数据清洗完,你得存起来。我推荐两种方案:
| 存储方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| CSV文件 | 个人小规模回测 | 简单、无需数据库 | 查询慢、不支持并发 |
| SQLite | 中等规模策略 | 轻量、支持SQL查询 | 不适合高并发写入 |
| MySQL/PostgreSQL | 生产环境、团队协作 | 性能好、支持高并发 | 需要运维成本 |
| InfluxDB(时序数据库) | 高频实时数据存储 | 写入快、压缩率高 | 学习曲线陡 |
本章知识体系
下面这张图,帮你理清数据获取的完整链路:
从数据源到最终存储,每一步都有坑。但只要你按照这个链路走下来,数据质量就有保障了。
- 入门用集思录+天天基金,零成本但效率低
- 半自动化用Tushare或AkShare,注意积分限制和数据质量
- 高频交易必须上WebSocket,毫秒级推送是关键
- 数据清洗比数据获取更重要,脏数据会毁掉你的策略
- 存储方案从小做起,SQLite起步,按需升级
数据搞定了,下一章我们聊聊怎么用这些数据构建套利策略。嗯,那才是真正开始赚钱的部分。