15天搭建ETF量化交易系统Day1—数据源模块

news2024/12/25 9:51:18

db2745c414645f32c829ea7eb497a4c3.png

搭建过程

2a6a8704739de2a3bdf4ebe1b0673e08.png

每个交易者都应该形成一套自己的交易系统。

 
 

很多交易者也清楚知道,搭建自己交易系统的重要性。现实中,从0到1往往是最难跨越的一步。

授人鱼不如授人以渔,为了帮助大家跨出搭建量化系统的第一步,我们决定推出这个主题系列。

这个系列中,我们用Python从0开始一步步搭建出一套ETF量化交易系统(选择ETF标的是因为对于普通交易者来说,ETF相对于选强势股难度要小,而且没有退市风险)。大家可以跟随着我们的实现路径来一起学习,从过程中掌握方法。

掌握了方法之后,你可以换成期货系统、比特币系统、美股系统,然后在实战中不断去完善自己的系统了。

搭建一套ETF量化交易系统涉及多个模块和组件的协同工作,包括数据源模块、量化策略模块、可视化模块、数据库模块、回测评估模块、自动交易模块等等。

DAY1我们介绍下如何搭建自己的ETF数据源模块

d2488e369dd5f59f52d1ddc85b971b70.png

ETF数据源‍‍‍‍‍‍‍

a3c696f21e89eaf85ef7f87219adcc1f.png

AkShare是基于Python的财经数据接口库,AkShare提供的API函数,可以直接获取ETF的实时行情、历史数据等。

我们使用AkShare作为ETF数据源。

我们使用命令安装下AkShare:

pip install akshare

我们需要三类数据:ETF代码和名称、实时行情数据以及历史行情数据。

使用fund_etf_category_sina 函数获取所有 ETF 基金的实时行情数据。

etf_data = ak.fund_etf_category_sina(symbol="ETF基金")
# 显示前10行
print(etf_data.head(5))
"""
   代码       名称    最新价    涨跌额    涨跌幅   买入   卖出   昨收   今开    最高    最低    成交量    成交额
0  sz159998  计算机ETF  0.714  0.021  3.030  0.714  0.715  0.693  0.695  0.717  0.693   39176900   27750943
1  sz159997   电子ETF  0.843  0.025  3.056  0.843  0.844  0.818  0.821  0.846  0.819   42597200   35630600
2  sz159996   家电ETF  1.175  0.012  1.032  1.174  1.175  1.163  1.163  1.181  1.160   77680200   91177308
3  sz159995   芯片ETF  0.826  0.024  2.993  0.825  0.826  0.802  0.801  0.826  0.801  480305699  393002419
4  sz159994   5GETF  0.766  0.030  4.076  0.766  0.767  0.736  0.740  0.771  0.740   56534500   43087108
"""
# 显示最后3行
print(etf_data.tail(3))
"""
    代码       名称   最新价    涨跌额    涨跌幅    买入   卖出   昨收   今开    最高   最低    成交量    成交额
934  sh510030     价值ETF  0.848  0.003  0.355  0.848  0.851  0.845  0.850  0.852  0.842  2808900  2381342
935  sh510020    超大盘ETF  2.753  0.040  1.474  2.751  2.753  2.713  2.724  2.756  2.724   653710  1789779
936  sh510010  180治理ETF  1.464  0.018  1.245  1.435  1.465  1.446  1.445  1.464  1.445    24900    36290
"""

fund_etf_category_sina 接口返回的是一个pandas DataFrame,包含了全部ETF基金的实时行情数据。每行数据代表一个ETF基金,通常包含以下列:

  • 基金代码:ETF基金的代码,用于唯一标识一个ETF基金。

  • 基金简称:ETF基金的简称或名称。

  • 最新价:ETF基金当前的交易价格。

  • 涨跌幅:ETF基金相对于前一日收盘价的涨跌幅百分比。

  • 涨跌额:ETF基金相对于前一日收盘价的涨跌金额。

  • 开盘价:ETF基金当日开盘时的价格。

  • 昨收盘:ETF基金前一交易日的收盘价。

  • 最高价:ETF基金当日交易的最高价格。

  • 最低价:ETF基金当日交易的最低价格。

  • 成交量:ETF基金当日的成交量。

  • 成交额:ETF基金当日的成交额。

fund_etf_category_sina接口还可以返回ETF的代码和名称。

# 打印ETF代码和名称
for index, item in etf_data.iterrows():
    print(f"ETF代码: {item['代码']}, ETF名称: {item['名称']}")


"""
ETF代码: sz159998, ETF名称: 计算机ETF
ETF代码: sz159997, ETF名称: 电子ETF
ETF代码: sz159996, ETF名称: 家电ETF
ETF代码: sz159995, ETF名称: 芯片ETF
ETF代码: sz159994, ETF名称: 5GETF
"""

fund_etf_hist_min_em 接口包含了指定ETF基金在指定日期范围内的分钟级历史数据。

# 使用 fund_etf_hist_min_em 获取 ETF 基金的分钟级历史数据。
etf_hist_data = ak.fund_etf_hist_min_em(symbol="510300", start_date="20240425", end_date="20240426")
print(etf_hist_data.head(5))
"""
             时间     开盘     收盘     最高     最低   涨跌幅    涨跌额     成交量          成交额    振幅   换手率
0  2024-04-25 09:35:00  3.503  3.501  3.509  3.501 -0.34 -0.012  321378  112617010.0  0.23  0.06
1  2024-04-25 09:40:00  3.502  3.499  3.502  3.498 -0.06 -0.002  268571   93992920.0  0.11  0.05
2  2024-04-25 09:45:00  3.500  3.499  3.501  3.498  0.00  0.000  187412   65579490.0  0.09  0.03
3  2024-04-25 09:50:00  3.499  3.496  3.499  3.495 -0.09 -0.003  208152   72790535.0  0.11  0.04
4  2024-04-25 09:55:00  3.496  3.501  3.502  3.495  0.14  0.005  153200   53594439.0  0.20  0.03
"""

fund_etf_hist_min_em 接口返回的是一个DataFrame,包含以下列:

  • 时间:分钟级别的时间戳。

  • 最新价:ETF基金在对应时间点的最新交易价格。

  • 涨跌幅:ETF基金在对应时间点的涨跌幅百分比。

  • 成交量:ETF基金在对应时间点的成交量。

  • 成交额:ETF基金在对应时间点的成交额。

  • 开盘价:ETF基金在对应时间段的开盘价格(可能并非每分钟都有开盘价)。

  • 最高价:ETF基金在对应时间段内的最高交易价格。

  • 最低价:ETF基金在对应时间段内的最低交易价格。

7a5638904bb7b82e1d60d82608d3171c.png

封装成类

5ca654a9e01a05b9b842fa9adf111c4c.png

作为一套系统,我们需要创建一个ETF数据源模块,供其他模块调用。于是创建一个ETFDataSource类,这个类提供了三个方法:

  • get_etf_codes_and_names:查询ETF代码和名称,返回DataFrame。

  • get_etf_real_time_data:获取指定ETF基金的实时行情数据,返回Series。

  • get_etf_hist_data:获取指定ETF基金在指定日期范围内的历史走势数据,返回DataFrame。

关键例程代码如下所示,完整代码可以前往知识星球下载。

class ETFDataSource:
    """
    ETF数据源模块,封装了akshare库的相关接口。
    """


    def __init__(self):
        """
        初始化ETF数据源模块。
        """
        pass


    def get_etf_codes_and_names(self):
        """
        查询ETF代码和名称。


        Returns:
            pd.DataFrame: 包含ETF代码和名称的DataFrame。
        """
        # 省略
        return etf_data[['代码', '名称']]


    def get_etf_real_time_data(self, symbol):
        """
        获取ETF实时行情数据。


        Args:
            symbol (str): ETF基金的代码。


        Returns:
            pd.Series: 包含ETF实时行情数据的Series。
        """
        # 使用akshare的fund_etf_category_sina接口获取ETF实时行情数据
        return real_time_data[real_time_data["代码"] == code]


    def get_etf_hist_data(self, symbol, start_date, end_date):
        """
        获取ETF历史走势数据。


        Args:
            symbol (str): ETF基金的代码。
            start_date (str): 开始日期,格式为'YYYYMMDD'。
            end_date (str): 结束日期,格式为'YYYYMMDD'。


        Returns:
            pd.DataFrame: 包含ETF历史走势数据的DataFrame。
        """
        # 省略


        return hist_data


if __name__ == "__main__":
    # 创建ETF数据源对象
    etf_source = ETFDataSource()


    # 查询ETF代码和名称
    etf_codes_and_names = etf_source.get_etf_codes_and_names()
    print("ETF代码和名称:")
    print(etf_codes_and_names)


    # 假设要查询代码为'510300'的ETF实时行情数据
    symbol = '510300'
    etf_real_time_data = etf_source.get_etf_real_time_data(symbol)
    print(f"\nETF {symbol} 实时行情数据:")
    print(etf_real_time_data)


    # 假设要查询代码为'510300'的ETF在指定日期范围内的历史走势数据
    start_date = '20240401'
    end_date = '20240426'
    etf_hist_data = etf_source.get_etf_hist_data(symbol, start_date, end_date)
    print(f"\nETF {symbol} {start_date}至{end_date}历史走势数据:")
    print(etf_hist_data)

说明

此系列为连载专栏,完整代码会上传知识星球《玩转股票量化交易》!作为会员们的学习资料。

想要加入知识星球《玩转股票量化交易》的小伙伴记得先微信call我获取福利!

非星球会员需要的话,需要单独联系我购买!

知识星球介绍点击:知识星球《玩转股票量化交易》精华内容概览

be27d86c6993a1ecaaa2d79c1532fd42.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1630227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Edge浏览器新特性深度解析,写作ai免费软件

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

Adfind的使用

Adfind是一个使用C语言写的活动目录查询工具,它允许用户轻松地搜索各种活动目录信息。它不需要安装,因为它是基于命令行的。它提供了许多选项,可以细化搜索并返回相关细节。下面讲解Adfind的参数以及其使用。 参数 执行如下命令即可查看Adf…

机器学习周记(第三十六周:语义分割)2024.4.22~2024.4.28

目录 摘要 ABSTRACT 1 FCN 2 双线性插值 3 膨胀卷积 3.1 gridding effect 摘要 本周继续学习了语义分割的内容,主要包括 FCN(全卷积网络)、双线性插值和膨胀卷积等方面。FCN 通过上采样的倍率可以划分为 FCN-32S、FCN-16S、FCN-8S&…

Unity | 优化专项-包体 | 字体

1. 字体包体占用 常用汉字字体文件大小通常在 10M~12M 左右,大概包含常见汉字 3.5w 个。我国汉字有大约将近十万个,全字库的大小对于游戏包体是灾难性的 在小游戏中,即使是常见汉字,大小也足以影响小游戏总包体,进而…

深入探索计算机视觉:高级主题与前沿应用的全面解析

引言 计算机视觉,作为人工智能领域的一个重要分支,旨在让计算机能够“看”懂世界,理解和解释视觉场景。随着深度学习技术的迅猛发展,计算机视觉已经在许多领域取得了显著的进展,如自动驾驶、安防监控、医疗诊断等。在…

vue使用source map调试

一、开发环境 1、开启配置:devtool: ‘eval-source-map’,跟mode配置平级 效果就是控制台报错行数和源码行数完全一致 二、生产环境 1、在生产环境下,一般要关闭source map,如果只想定位报错的具体行数,且不想暴露源码。此时可…

《苍穹外卖》Day11部分知识点记录(数据统计——图像报表)

一、Apache ECharts 介绍 Apache ECharts是一款基于javascript的数据可视化图标库,提供直观、生动、可交互、可个性化定制的数据可视化图表。 官网地址:https://echarts.apache.org/zh/index.html 效果展示 柱形图饼图折线图 入门案例 1. 在 echart…

CAS机制(Compare And Swap)源码解读与三大问题

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java源码解读-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 1. 前言 2. 原子性问题 3. 乐观锁与悲观锁 4. CAS操作 5. CAS算法带来的…

【算法】组合回溯专题

组合总数 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…

MySQL-多表查询-练习

练习 1.写一个查询显示所有雇员的 last name、department id、anddepartment name。 SELECT e.LAST_NAME,e.DEPARTMENT_ID,d.DEPARTMENT_NAME FROM employees e,departments d WHERE e.DEPARTMENT_ID d.DEPARTMENT_ID;2.创建一个在部门 80 中的所有工作岗位的唯一列表&#x…

2024长三角快递物流展:科技激荡,行业焕发新活力

7月8日,杭州将迎来快递物流科技盛宴,这是一年一度的行业盛会,吸引了全球领先的快递物流企业和创新技术汇聚一堂。届时,会展中心将全方位展示快递物流及供应链、分拣系统、输送设备、智能搬运、智能仓储、自动识别、无人车、AGV机器…

nginx修改http为https

Linux运维工具-ywtool 目录 一. 获取 SSL 证书1.安装openssl2.自签名证书 二.安装SSL证书三.配置Nginx支持HTTPS四.重启nginx 一. 获取 SSL 证书 SSL/TLS证书是用来验证服务器身份和提供一个安全的连接通道的 获取SSL/TLS证书有几种方法 1.购买域名,购买SSL证书 2.自签名证书…

测试基础 学习测试你必须要知道的基础知识

1.认识测试 在学习测试之前,我们需要明白以下几点 1.什么是测试 2.测试的岗位有哪些 3.测试开发和开发之间的区别 4.优秀的测试人员需要有哪些品质 我们大概说一说 其实生活中处处有测试 我们试衣服 我们在买手机之前先看手机功能符不符合需求 这些都是测试 测试主要就是为了发…

Java | Leetcode Java题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> permute(int[] nums) {List<List<Integer>> res new ArrayList<List<Integer>>();List<Integer> output new ArrayList<Integer>();for (i…

保护企业财务报告,这款防泄密软件做得到!

在日益增长的金融欺诈和网络攻击中&#xff0c;保护企业的财务报告是维持公司声誉和稳定运营的关键。财务报告包含了公司的敏感信息&#xff0c;如利润、收入、财务结构等&#xff0c;一旦泄露&#xff0c;可能会对公司造成不利影响。华企盾DSC数据防泄密系统为企业提供了全面的…

第58篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

决策树模型示例

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个决策树模型pytorch程序,最后打印5个条件分别的影响力。 一 决策树模型是一种非参数监督学习方法&#xff0c;主要…

SpringMVC进阶(数据格式化以及数据校验)

文章目录 1.数据格式化1.基本介绍1.基本说明2.环境搭建 2.基本数据类型和字符串转换1.需求分析2.环境搭建1.data_valid.jsp首页面2.Monster.java封装请求信息3.MonsterHandler.java处理请求信息4.monster_addUI.jsp添加妖怪界面5.单元测试 3.保存妖怪信息1.MonsterHandler.java…

【面经】汇总

面经 Java基础集合都有哪些面向对象的三大特点ArrayList和LinkedList的区别&#xff1f;ArrayList底层扩容是怎么实现的&#xff1f;讲一讲HashMap、以及put方法的过程讲一讲HashMap的扩容过程Hashmap为什么要用红黑树而不用其他的树&#xff1f;Java8新特性有哪些LoadFactor负…

ASP.NET企业投资价值分析系统

摘 要 本文将影响股票投资价值的宏观因素、行业因素、企业内部等诸多因素予以量化分析&#xff0c;对钢铁板块和汽车板块各上市公司进行综合评估&#xff0c;为广大股民的投资方向和资金安全提供了有力的支持。本文还阐述了企业投资价值分析的必要性&#xff0c;说明了企业投…