cover_image

基金套利半自动化,从爬虫到API

东哥的平凡生活 静听烟雨任平生

一、前言

在LOF套利系统的开发过程中,数据获取一直是核心挑战之一。今天傍晚,无敌大佬发布了新的文章,跟着无敌哥使用DeepSeek学习Python的库和数组他紧锣密鼓完成了API接口的开发,给我们"全家桶半自动交易小组"开辟了绿色通道。


插播广告,欢迎大家加入全家桶,凡是凑齐7龙珠加入了全家桶的 & 附送我一个龙珠,我将拉你进小群,赠送我开发的"半吊子"源码程序,提供程序安装、运行的咨询,但每个人后续的定制化调试还是要依靠大家自己在AI的帮助进行了,我不负责调试他们的程序啊


从最初的爬虫方案到如今的API接口,经历了一次技术上的优雅升级。

二、爬虫方案的原理与缺点

1. 爬虫原理

我们最初的程序采用的是网络爬虫技术:

  • HTTP请求伪造:通过构造HTTP请求,模拟浏览器访问Palmmicro网站
  • HTML解析:获取网页HTML后,使用解析库提取结构化数据
  • 数据提取:从HTML中提取LOF基金的估值数据,包括净值、锚点ETF信息

2. 爬虫的缺点

  • 服务器负担:每个爬虫请求都会占用服务器资源,现在全家桶半自动交易小组的多个用户同时使用可能会导致服务器负载增加
  • 数据一致性:HTML结构变化时,爬虫可能失效,数据解析可能不完整或出错
  • 稳定性差:容易受到网站反爬机制的影响,可能被封禁IP
  • 维护成本高:需要定期更新爬虫代码以适应网页结构变化

三、API方案的优势

1. API原理

API(Application Programming Interface)是一种定义好的接口,允许不同软件系统之间进行通信:

  • 结构化数据:直接返回JSON格式的结构化数据,无需解析HTML
  • 高效通信:API设计为高效处理请求,响应速度快
  • 稳定可靠:API接口稳定,不会因网页结构变化而失效
  • 权限控制:通过Token验证身份,防止滥用

2. API的优点

  • 减轻服务器负担:API设计为高效处理请求,服务器可以更好地控制请求频率
  • 数据准确性:直接从服务器获取数据,避免了解析错误
  • 易于集成:提供标准化的接口,便于集成到各种系统中
  • 可扩展性:可以根据需求添加新的API端点和功能

四、API程序详解

1. 核心文件结构

woodykey/
├── _mytoken.py    # 存储API Token
├── telegram.py    # 核心通信模块
└── main.py        # 示例脚本

2. _mytoken.py - 安全配置

BOT_TOKEN = "XXXXXX"

作用:安全存储API Token,避免硬编码在主代码中。

使用建议: 不要将此文件上传到代码托管平台, 确保Token的安全性,避免泄露。

3. telegram.py - 核心通信模块

3.1 post_json_array_to_telegram函数

核心代码

# 构建API请求URL
url = f"https://palmmicro.com/php/telegram.php?token={bot_token}"

# 序列化数据为JSON,支持中文
json_payload = json.dumps(data_array, ensure_ascii=False)

# 发送POST请求
response = requests.post(
    url, 
    data=json_payload,
    headers={'Content-Type''application/json'},
    timeout=timeout
)

# 解析返回数据
received_data = response.json()

作用:核心通信函数,处理API请求和响应。

技术要点

  • 构建带Token的API URL, 发送HTTP POST请求, 解析JSON响应数据
  • 完善的异常处理(超时、HTTP错误、网络错误、JSON解析错误)

3.2 FetchPalmmicroData函数

核心代码

def FetchPalmmicroData(strSymbols):
    # 构造Telegram风格的消息格式
      
    # 调用API发送请求
    result = post_json_array_to_telegram(ar, BOT_TOKEN)

作用:构造API请求格式并调用通信函数。

技术要点

  • 构造Telegram风格的消息格式(API要求的固定格式)
  • 动态设置时间戳和基金代码
  • 调用post_json_array_to_telegram发送请求,处理API返回结果

4. main.py - 示例脚本

核心代码

from telegram import FetchPalmmicroData

# 调用API获取基金数据
FetchPalmmicroData("SZ160719,SZ161125,SZ162411")

作用:展示API的使用方法。

技术要点

  • 导入FetchPalmmicroData函数
  • 传递基金代码参数(多个代码用逗号分隔),调用API获取数据

五、API调用流程

1. 准备工作

  • 确保安装了requests库:pip install requests
  • 准备好API Token(从woody处获取)
  • 导入必要的模块和函数

2. 调用步骤

  1. 构造请求:调用FetchPalmmicroData函数,传入基金代码
  2. 发送请求:函数内部构造Telegram风格的消息格式并发送
  3. 处理响应:获取并解析API返回的JSON数据
  4. 使用数据:将返回的数据用于估值计算和套利分析

六、API使用注意事项

1. 安全性

  • 保护Token:不要将API Token泄露给他人
  • 合理使用:不要过于频繁地调用API,避免给服务器造成负担
  • 数据脱敏:在日志和代码中避免记录敏感信息

2. 错误处理

  • 网络错误:处理网络连接问题和超时
  • API错误:处理API返回的错误信息
  • 数据错误:验证返回的数据格式和内容

3. 性能优化

  • 批量查询:一次查询多只基金,减少API调用次数
  • 缓存机制:缓存API返回的数据,避免重复查询
  • 异步调用:使用异步方式调用API,提高程序响应速度

七、总结

从爬虫到API的转变是LOF套利系统的一次重要升级:

  • 技术进步:从解析HTML到直接获取结构化数据
  • 效率提升:API响应速度快,数据格式规范
  • 可靠性增强:不受网页结构变化影响,数据准确性高
  • 减负:既减轻了服务器负担,又获得了更可靠的数据

API的使用为LOF套利系统提供了坚实的数据基础,使得半自动交易的套利系统成为可能。随着系统的不断完善,相信LOF套利将会变得更加精准和高效。

八、未来展望

  • 功能扩展:API可能会添加更多功能,如实时行情、历史数据等
  • 系统集成:与QMT等交易系统的深度集成
  • 智能分析:基于API数据的智能套利策略
  • 生态建设:构建更加完善的LOF套利生态系统

九、实际应用案例:修改数据读取程序

1. 数据读取子程序的改造目标

刚刚,我已经完成了基金套利程序中的“数据读取子程序”的改造。

从使用爬虫获取数据改为了使用API获取数据,提高数据获取的可靠性和效率,同时保留爬虫作为备份机制。

2. 改造前的数据获取方式

在改造前,数据读取程序使用爬虫获取以下数据:

  • LOF基金仓位数据:通过爬取Woody网页获取LOF基金的仓位信息
  • LOF基金权重数据:通过爬取Woody持仓页面获取黄金和原油类基金的ETF持仓权重
  • 锚点ETF数据
    • GLD、USO及其区域变种(^GLD-EU、^GLD-JP、^USO-EU、^USO-HK、^USO-JP)从Woody爬取
    • XOP、XBI、SLV、QQQ、SPY从新浪爬取
  • 校准值数据:通过爬取Woody网页获取黄金、原油和其他LOF基金的校准值
  • 人民币中间价:从外汇管理局获取

3. 改造后的API数据获取

改造后,数据读取程序优先从API获取以下数据:

  • LOF基金数据:LOF基金的仓位、权重、净值等信息
  • 锚点ETF数据
    • GLD、USO及其区域变种的价格数据
    • XOP、XBI、SLV、QQQ、SPY的净值数据
  • 校准值数据
    • 黄金校准值(取160719的)
    • 原油校准值(取501018的)
    • 其他LOF基金的校准值(取各自的)
  • 人民币中间价:优先从API获取,失败时回退到外汇管理局

4. 改造步骤详解

4.1 集成API模块

  1. 复制API相关文件:将telegram.py_mytoken.py复制到程序目录
  2. 安装依赖:确保安装了requests库
  3. 导入模块:在程序中导入API函数并添加API可用性检查

4.2 实现主备切换机制

  1. 优先使用API:程序首先尝试从API获取数据
  2. 智能回退:当API获取失败时,自动回退到爬虫获取数据
  3. 数据一致性:确保API和爬虫返回的数据格式一致,便于后续处理

4.3 时间窗口处理

  1. T-1日数据:从API获取T-1日的GLD、USO及其变种数据
  2. T日数据:根据不同市场的交易时间,设置不同的获取时间窗口
    • JP数据:14:35之后获取
    • HK数据:16:35之后获取

4.4 数据处理优化

  1. ETF净值处理:从API获取XOP、XBI、SLV、QQQ、SPY的净值,写入basic表格
  2. 列顺序调整:将XBI列移动到SPY列的左边,优化表格结构
  3. 校准值处理:从API获取校准值,确保数据的准确性

5. 改造效果

5.1 性能提升

  • 数据获取速度:API响应速度比爬虫快3-5倍,大幅减少数据获取时间
  • 网络请求次数:从原来的12次网页请求减少到1次API请求,减轻服务器负担
  • 数据处理效率:直接处理JSON数据,避免了解析HTML的开销

5.2 可靠性增强

  • 数据一致性:API返回结构化的JSON数据,避免了爬虫解析HTML时的错误
  • 稳定性:API接口稳定,不受网页结构变化影响
  • 容错机制:当API获取失败时,自动回退到爬虫,确保数据不遗漏

5.3 功能增强

  • 数据完整性:API返回更完整的数据,包括基金净值、人民币中间价等
  • 时间窗口优化:确保在正确的时间窗口内获取最新数据
  • 日志输出:明确标识数据来源(API或爬虫),便于排查问题

6. 改造后的优势

  • 代码更简洁:API调用代码比爬虫代码更简洁易读,减少了代码量
  • 维护成本低:不需要定期更新爬虫代码以适应网页结构变化
  • 扩展性强:可以方便地添加新的API功能,如实时行情、历史数据等
  • 用户体验好:数据获取速度快,系统响应迅速
  • 服务器友好:API请求更加高效,减少服务器负载

7. 实际运行效果

改造后的数据读取程序运行效果显著:

  • 数据获取时间:从原来的30-40秒减少到5-10秒
  • 数据准确性:API返回的数据更加准确,避免了解析错误
  • 系统稳定性:运行更加稳定,减少了因网页结构变化导致的故障
  • 提速:数据更新速度快,套利机会把握更及时

继续滑动看下一个
静听烟雨任平生
向上滑动看下一个