分享

港股量化交易-基于富途OpenAPI+Python开发的量化交易程序

 精诚至_金石开 2023-09-03 发布于上海
TL;DR直接先上代码,要是有兴趣自己研究或者编程背景较强的小伙伴们可以直接跳去github,也欢迎各路大神们给个star~
这个项目也是写了快一年多了,从一开始只是想借用富途的API下载一些分时数据来回测,到现在已经建立完一个完整的算法交易框架,也算是颇有感慨。现在终于整个系统已经颇有雏形了,那么是时候回馈给大家让更多的个人投资者可以利用量化交易去在市场中获得更多的先机。
2023-02-04:近期开始尝试使用FutuAlgo进行策略选股以及日常邮件推荐功能的开发,初期开源的选股Filter包含常见的价格选股、交易量选股、以及几种技术指标(如MACD金叉等热门买入信号)选股。个人也结合自己对于市场的理解写了一些私人的选股器,如果有兴趣的话可以填一下问卷然后订阅我的日常选股邮件哈~
FutuOpenAPI自身提供条件选股功能,详细使用方法可以参考以下链接:
根据参考文档,目前Futu总共提供三种Filter格式,分别为
港股量化交易-基于富途OpenAPI+Python开发的量化交易程序-有驾
在Futu_Algo中,Futu自带的基础条件选股被用作快速过滤“仙股”或者和投资策略不相关的股票,例如目前预设的代码中会使用财务属性去过滤掉价格在1HKD以下以及交易额少于1000w的股票,这样保证了交易策略不会受到流动性差的股票突然地暴涨暴跌而经常发出买卖信号。
在Futu_Algo中定义自己的策略过滤其实非常容易,简单来说只要继承Filters这个class然后实现里面唯一的一个abstractmethod“Validate”就行了。举个非常简单的例子,假设我们想要选择一个股票的价格在MA5,MA10以及MA20以上,则我们需要对收到的数据进行parse以及计算所需要的技术指标。
我们的Validate功能需要两个input数据,分别是input_data(历史K线价格数据,QuantitativeData)和input_info(YahooFinance获取的公司基本面信息,QualitativeData)。目前范例中的策略知识用到了QuantitativeData而并没有基于基本面信息去进行筛选,但是有更高需求的量化交易者可以自行进行开发,原理和目前提供的范例十分相似。
以下我们用MA_Simple这个策略来简单阐述以下具体策略选股的实现逻辑:
总结:总体的策略筛选逻辑和交易策略逻辑类似,如果想将买卖信号移植到策略筛选模块中,可以直接将对应的parse_datafunction中的计算逻辑搬过来,实现无缝衔接。
如果有多个criteria的话也可以用all()function进行快速判断,例如在Triple_Cross中,策略筛选的条件是基于当前交易量在前十个时间点中是最大值且收盘价穿过MA5、MA10和MA20的复合信号:
总结:用户可根据自身策略筛选的复杂程度自由编写Validate业务逻辑,最终只需要回传bool值即可
策略选股相关主要业务逻辑都保存在stock_filter_engine.py中,用到了multiprocessing中的Pool去实现多线程计算。这里可以用多线程的原理是每个股票的数据和策略筛选判断都是相互独立的,例如我想判断HK.00001和HK.00002是否复合我们的TripleCross筛选条件,我们同时建立两个job然后分辨分配给不同的thread去计算validate筛选条件是否成立。
这里针对香港市场的股票和国内市场(上交所和深交所)的股票处理是不同的。
对于香港市场的股票,由于YahooFinance(雅虎财经)作为目前数据最全和最丰富的免费提供商,FutuAlgo主要透过yFinance进行日线行情数据的获取并进行筛选。
港股量化交易-基于富途OpenAPI+Python开发的量化交易程序-有驾
对于国内市场的股票,由于大部分数据源均需付费,目前本人挑选了Tushare数据(Tushare数据)作为免费的数据源进行选股,只要注册Tushare并修改个人资料便可以获得足够积分进行免费下载沪深股票的日线行情。
港股量化交易-基于富途OpenAPI+Python开发的量化交易程序-有驾
在设计Futu_Algo的时候,其实已经考虑到了后续一些对于高定制化交易算法有需求的投资者可能想使用复合指标或者更复杂的交易决策算法去进行买卖,所以我根据主流用户常用的几种基于技术指标的算法交易策略写了模板,方便大家进行参考和自定义更改。
在实际计算MACD和KDJ等参数的时候,也曾经考虑过直接使用富途牛牛官方推荐的ta-lib技术指标库进行计算,的确也能节省大量的开发时间,但是...
所以在实际计算过程中,Futu_Algo没有调用ta-lib现成的MACD指标计算方法,而是透过Pandas和yFinance重新计算确保和富途牛牛上展示给用户的数值吻合。针对目前发现有问题的几中常见指标如MACD、KDJ和其他使用到EMA方法的指标均已提供对应的Pandas计算方法在strategies文件夹中。
首先,每个策略都是继承strategies.py这个父类,每个策略都需要实现(自己去定义相关方法的逻辑)
其次,每个策略instance都会存储所有需要用到这个策略的股票代号,存放在input_data这个dict中。
最后,针对parse_data的核心逻辑来讲一下
所以每次行情数据刷新的时候,技术指标的数值都会进行更新,重新计算MACD数值用于交易决策。
下次再写~
Futu_Algo主要能提供分K和日K数据,分K提供最近2年数据,日K及以上提供最近10年的数据。目前项目支持下载港股以及美股相关数据,只要提供相对应的股票代号即可进行自动下载。
数据下载后主要是存放到以下这种格式:
数据格式Parquet
Parquet是Hadoop生态圈中一种新型列式存储格式,与其他文本格式如CSV相比,在AmazonS3中卸载速度快2倍,存储空间消耗少6倍[2]。相较另一种大数据格式Feather来说,Parquet是更适合long-term储存的格式,在实际使用当中和Feather格式的差距也不会很大。
选用Parquet也是近期的新改动,在完全将原本的CSV格式改成Parquet之前我也做了一个自己的比较。其中近300+股票的3年分钟数据以CSV格式存储共计约有4GB+,转换成Parquet格式后只需要1.9GB左右,有效提升了空间利用率。其次根据股市数据的使用场景,绝大部分场景都是read-only,只有在第一次写入新数据或者更新日线的时候需要write,所以综上分析组中选用了Parquet作为数据储存的格式。
股市数据下载
数据下载其实并没有想象中那么直接和简单,其实在实践中开发中有很多出乎意料的小细节需要注意,那我接下来总结一两个我之前翻车的点以及我最后解决的方案:
港股量化交易-基于富途OpenAPI+Python开发的量化交易程序-有驾
主要负责底层I/O数据处理的模块我统一放在data_engine当中,相当于一般MVC框架中的Model这一部分。目前data_engine主要由四个class,分别是
~~这里下次继续更,补充一下具体我处理历史价格数据的实现逻辑
下次继续!~大家要是觉得有帮助的话可以透过给个Star或者赞同鼓励一下作者哦

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多