粉丝2134获赞2.5万


电话交易的两大核心就是数据和交易,皮吹的提供了完整的接口,数据指的是实时的 tick 数据,从一分钟到一年周期的历史数据。当天的 l l 主笔委托和成交数据, 财务数据交易则支持现价试价,支持委托和成交回调。先给大家讲一下数据接口。 一、实时 tick 数据 get snapshot 这个快照是三秒的合成数据,也是 l e 的 基础数据,大部分量化策略都是用实时 tick 数据来监控市场的。第二,历史数据 get history 该接口呢,是用于获取最近 n 条历史行情 k 线数据,支持二零零五年后的所有一分钟到一年周期的历史数据。多做量化的朋友都想把历史数据本地存证研究, 不过还是很需要小技巧的。三、 l 二,主笔委托和成交这个咱们后面会专题讲到,记住咱们匹配的有 l 二的免费数据,并且还有很多使用技巧哦。四、财务数据包含九大财务表,每个表里还有若干的字段,财务数据啊,非常丰富。二、下单接口 第一,现实下单 order 非常简洁,小白一眼都能看懂。第二,市场下单 order market 市场下单方式简单,更具有主动性,对于需要快速成交的策略来说是必备的。第三, 委托和成交回调。要想确保交易按预想完成,委托和成交主推必不可少。以上就是匹配的数据和交易主要接口,掌握了这些接口啊,就可以进一步实现自己的量化策略了,剩下的就看大家怎么结合自己的思路把这些接口用活了,毕竟接口是工具,策略才是灵魂。

啊,今天我们录一个完整的视频,然后 comd 怎样快速上手和一个使用,然后今天的话我详细介绍一下 comd 的 一些功能,还有怎样去使用编编写策略。 啊,这是 p 吹的话大概的一个介绍,它就是在真公司服务器上运行的一个交易交易系统,它是属于呃,这个是属于那个很很深开发的,这个就它的简单介绍,然后前面已经介绍过了,这也就不详细介绍了, 我今天看一下怎样快速的去入手这个 p c 啊,首先的话我们肯定是是找建公司去申请这个 p c 的 这个炼化软件,然后进行登录就行了,然后 p c 的 话它分为那个模拟盘和实盘,我这个就属于那个模拟盘, 然后实盘的话就找建公司去申请开通就可以了。实盘的话需要的话我们看见他有几个界面,第一个的话,建的话看见的是行情 条形的话,他主要是自己做这个自选股的一些管理和和这个坎看盘,这个的话一般自己使用不到,我们重点看的是那个交易工具和量化这几个。 首先交易建议的话,我们可以看见它是支持股票交易、期权交易,还有这个融资融券交易,到目前的话,期货交易的话在 p g a 没有没有支持,但是只有少数的证券公司它是支持了期货交易,但是非常少。而然后下面的话是工具, 而工具的话它是包含了 pk 系统中自带的几个几个工具,我们可以点这个新增,他右上角有这个新增,然后就可以添加我们需要的工具,他他有这个一天服的趋势交易、智能条件单,还有算法交易、网格交易、篮子交易,还有抢单交易、可转债的一个套利, 还追涨停啊,拐点啊,还有个趋势交易,还有快速交易、热泪回转,还有 etf 套利,还有快速交易,如果你不懂它怎么使用的话,你再点这个,比如我点这个拐点交易,你把鼠标放上去之后, 它会弹出一个查看详情,查看详情的话就它的那个教程,就怎样去使用这个拐点交易的一个教程,它有详细的一个说明, 还有一个就是怎样去设置这个参数,在它的这个详情里面有具体的一个教程,然后我们就可以根据我们需要的这个模板,然后选择对应的模板来做我们次列的一个交易,这个的话它是在这个 pk 里面自带的模板,可以直接使用。 然后下来的话主要看量化,量化这个的话是我们看的重点,因为做量化交易,它这也就是量化的交易 啊。这的话因为占公司的这个服务器应该是主要是在维护,所以这的话估计是我应该是进不去,因为这几天这个服务器的一个在迁移 好,这个量化的话,这也的话进不去。但我再说一下量化它里面大概有几个几个功能, 一个的话是量化研究,量化研究的话主要是做那个量化的交易的一个编写,然后编写完之后他有个量化的一个回测, 回测的话,他那个回测按钮的话在模拟盘中有回测按钮,在实盘中是没有那个回测回测的那个按钮的,所以你要做回测的话需要在这个模拟盘中,然后点击回测, 点击回测完之后就可以进行一个交易。如果我们做完交这个回回测之后,我们做完之后,他旁边右上角还有一个交易的一个按钮,我们可以选择自己的策略进行一个交易 啊,这个这个系统的话应该是目前是应该上不去的,然后总部的话他应该是要维护应该到六月,六月五号左右。然后下面的话是一个这个一个交易的一个工具吧,相当于这里的话可以理解为他是一个交易的一个快捷键, 而同时他有些是一些系统设置,系统设置里面有一些篮子设置啊,力回购设置啊,像这的话就可以做一个力回购的一个提醒,这个就设置里面的一个功能,它包括交易设置, 还有篮子交易,还有这个定时的一个交易文件的一个导入导出,这都是可以进行在设置里面可以做的 好。重点的话如果你是一个酿化小白的话,你可以重点看一下他的这个工具,在工具中选择我们的需要做的 呃,做的模板来做交易,他的话这工具还是非常全的。像他这个网格的话是是基本是包含了常见的所有网格,应该是包含了这个常见的,然后这个我们怎样去新建他里面的这个网格的话,就可以点这个网格交易 啊,这会新建交易,但是现在的话估计是建不了,因为总部的服务器好,这个下的话,这个是我当时的一个网格交易, 然后他这的话他是设了网格大小,然后在这个网格中他会显示上一个网格,下一个网格,他的一个,一个就是在哪个区间,然后进行交易。 好,这是他的一个网格面板,然后后面的话我我会出教程,然后详细说一下他里面的一个具体的参数。他这网格的话还是非常前面的,他包含了常见的几种网格类型,比如什么金字塔网格,到金字塔网格还有一个限价单,限单这边都有的 啊,这这这的话他这一些因为是设置好的啊,因为今天的话,因为主要是建公司的服务器,这个在维护,所以在交易这量化这个模块的话,目前进不去,后面的话会补解这个量化这个模块,然后怎样使用的这个教程 啊?今这个这个只有实盘的话是正常的,这倒没有影响,主要是模拟盘的话是在维护演习吧。 好,今天的话大概的使用就到这里,然后包括七年交易啊,然后融资融券交易啊,在 p a 中它是已经支持了的。

哈喽,朋友们大家好,今天要给大家分享的是 l 二数据,因为匹配的是一个云端服务器,直接部署在券商机房的,因此啊,它有两个有利条件,第一呢是物理距离近,离交易所的物理距离啊,非常近,再加上极速柜台能够节约十至四十毫秒。 第二,具有 l 二数据,也就是主笔的委托和成交,一是获取主笔委托行情,二是获取主笔成交行情。取到的数据呢是以如下,大家可以看到原始的委托数据,因为各股的交易热度不同啊,时间在几毫秒至百毫秒左右,是不是比三秒合成的 tick 数据更加精准呢? 不过啊,只有实盘权限才能取到,详情呢,可以在主页进行了解。这里要留意的是, ptr 的 l 二数据只能主动获取,但是啊,这也难不倒咱们聪明的玩家,核心思路呢,很简单,用毫秒级别的循环主动取, 取了之后再拼接数据,这样的话就可以在理论上获得一百毫秒的实时数据,就算再加上网络延迟,计算延迟大概也就在耽误一百毫秒。勉勉强强用个两百毫秒的高频数据,对于 l 一 的三秒而言已经快了十五倍了,再加上有的券商支持独立服务器,稳定性也有保障, 这样简易版的 l 二数据敏感度要求高的策略,我相信都会有不错的提升,所以朋友们,你们会选择匹配的吗?

做量化投资最重要的是什么?答案永远只有一个,那就是策略,可我不会写代码,不懂编程,甚至我数学也很差,但是只要你看完我的这期视频,我包你能写出策略,而且还是符合平台要求的策略。 首先呢,我们需要准备两个东西,第一个就是带 agent 功能的 ai 软件,在这里我所使用的呢是国内的 tree solo agent。 第二个呢,我们需要准备 ptr 的 联发资料库,其中呢就是 ptr 的 api 的 接口信息以及 ptr 的 财务数据接口信息。这两个文件呢都是我独立整理的,有需要的同学可以滴滴去免费获取的。 另外我们要清楚的知道的是,用 agent 写策略代码大致分为两种做法,首先呢就是整体想法以及逻辑的复现,这个想法是比较复杂的,那么就需要用到 agent plan skill 这个技能,也就是先出计划,然后确认需求无误之后再动手写这个策略的代码。 这个能力呢就是传统的它是 ai 所无法具备的。其次呢,就是代码的修改以及优化,所对应的呢就是系统提示报错以及功能模块的增减这两个项目。当然话不多说,我们可以进入实操。


家人们,零代码,我用屁 tree 向导师策略工具写出了戴维斯双击策略。 wow, 当屁 tree 向导师策略工具遇到 ai buff 叠加,如何生成戴维斯双击策略操作攻略来了! 首先简单介绍一下什么是 p tree 向导式策略工具。零代码因子库,可回测,有源码内置、财务、行情技术等多种选股因子,仅需鼠标点点点,几分钟内即可轻松构建并生成一个可执行的量化策略。用 p tree 向导式策略工具,我实现了小市值策略、 双均线策略、低波红利策略、 多因子策略。那么有人就问了,这么多因子里面,这些指标怎么搭配?技术指标是什么意思?我想要实现某个策略,这些指标怎么组合? 于是我想到了 ai 工具,让 ai 通过熟悉 p tree 向导式策略工具及指标,帮助我输出量化策略搭建方案。 p tree 向导式策略工具加 ai 约等于量化策略的无数种实现,下面就来介绍一下我的操作。以 deep seek 为例, 首先我把 ptray 向导式策略的指标库文档发给 ai, 然后对话框输出我的指令,根据文档中的指标,结合戴维斯双击投资理念,帮我生成一个策略配置方案。随后, deepseek 根据文档指标库及策略需求,输出非常详细的指标设置指南。 接下来打开 ptray 向导式策略工具,根据 ai 给到的指标设置操作指南,一项项完成对应指标的配置和选择。 配置完成后,点击下一步回测,输入回测资金周期等要求,开启一键回测系统,自动生成该策略的回测收益曲线及数值。一个戴维斯双击策略就这样完成了。同时,向导式策略工具还支持导出该策略的原代码, 做更多的调试和策略因子挖掘。按照这个思路,我们可以结合 ai 大 模型,在 p tree 向导式策略工具上实现不同的策略。一、把 p tree 向导式策略指标文档发给 ai。 二、输入想要生成的量化策略需求。三、根据 ai 给到的指标配置指南,在向导式策略工具中设置 四回测,验证策略效果。按照这个思路,我们可以借助 ai 在 p tree 向导式策略平台中实现各类量化策略。当然,前提是所选策略逻辑与向导式策略工具平台现有指标库适配。目前,平台正持续扩充完善因子与指标体系, 进一步拓展策略开发空间。同时需要注意的是,使用 ai 生成策略难免存在偏差,可以作为辅助工具使用,通过反复调试,优化参数、修正逻辑,打磨出贴合自身需求的成熟策略方案。

哈喽,大家好,我是小亮,今天我带大家了解一下貔貅的量化交易中回测数据的获取方法。首先我们学一下获取股票池方法。获取股票池我们一共可以分为三种,一种是按全市场来获取股票池, 一种是按指数获取成分股,一种是按行业获取股票池。好,我们先看一下第一个按全市场获取股票池,我们获取全市场股票池可以通过 get h s 这个函数,它有一个参数是 date, 那 默认是 now, 那可以随便选任何一天的日期作为参数,这样的话就会试到指定的某一天的一个全市场股票池,如果不选,那就是会测当天的,我们现在会测一下,看一下一共选出多少股票, 一共三千七百五十三只股票。好,接下来我们学习一下如何按照指数获取成分股。 这边我们所用的函数叫做 get index stocks, 他 这边有两个参数,第一个参数是指数的代码,第二个是指定的一个日期, 前面代码我们这边选择了沪深三百,我们要注意一下它的尾缀是点 x b h s, 这是指数的后缀,那我们这边能够取到就是二零幺六年六月二十日这一天沪深三百的一个成分股, 这边我们看到一共三百个股票。好,接下来看一下获取行业的成分股,我们用的是 get industry stocks, 这边参数只有一个,那就是一个行业或者说概念,它的一个指数代码 尾缀也是一样,用 x b h s, 我 们回测一下。 接下来我们学习一个获取历史数据的一个方法,第一个方法叫做 get history, 这边的几个参数给大家介绍一下。第一个是长度,也就是说十天,那我们如果是按天去取,那么就是十根 k 线, 然后这个这边是我们之前录的,周期是一天,然后这边是他的一个字段,收盘价或者成交量都是可以的,或者多个字段,我们用 list 的 方法录餐,然后这边是 cgr 做了一个股票池的设定, 也可以是单个股票,这边权矩变量设了,然后这边 fq, 它代表除权。 include 这边是包含了一个字段, 如果是选择了 false, 那 就不包括最后一天,比如说是今天的,那我们不选 false, 就 不包括今天了。如果说是 true, 那 就是包括最后一根,我们待会一起打印。先把方法给介绍完,然后我们这边看一下方法二, 方法二是 get price, get price 呢,他有两种用法,第一种用法他第一个入仓是一样的,都是股票。 然后第二个录餐,第一种用法呢,我们用的是 startdate 和 enddate 的 一个组合,就是把两个时间录进去,我们获取到这两个时间周期内的数据。这边的录餐跟 gethistory 是 一样的,这边是一个周期,这边是一个字段,然后这边是一个赋权方式, 但是它没有 include 这个参数,就是不能包含于或者不包含 get press 的。 第二种就是 enddate 和 count 的 一个组合用法,也就是说我设定了最后一天的日期以后,然后 count 就是 最后一天往前数几天这样的方式来取。 另外一种就是用 data, data 是 一个只要在 set universe 把股票已经进行一个设定以后,这样的股票我们都可以用 data 来取数据,这些是我们系统已经存储好的数据,这样比 get history 的 方法会快一些。 这边的话就是用 date, 因为它是个字典,然后我们用字典的方式取到它这个对象,然后把它取出来以后,它里面有成交量,价格都有,我们来取一下 price, 就是 最新价,那我们就可以取到价格了,这就是在回测中我们用到的三种回测取数据的函数, 那我们都进行打印看一下,结果 好都出来了,这个就是 get history 的 一个结果。 这两条呢就是方法二, get price 的 第一个 get from 二,它是六月七号到六月九号开始,它这边是取了两天 get from 三,这边取了五天的数据,然后最后一个就是通过 data 的 方式取九十五点三五, 这边我们会测,就主要这三个方法,交易会有更多的方法,我们在后续的视频中进行一些介绍, 接下来我们学习一下获取财务数据的方法。取财务数据我们这边用到的是 getfundaments 函数,这边也一样有两种取数据的方法。 首先我们看一下第一种方法,第一个入参是股票,也可以是股票池,第二个参数是财务数据表, 就是这个 income statement, 这个表所对应的里面所有的字段,我们可以在帮助文档进行一个查询,确定我们在这个表里面的某一个字段可以取出来,然后再把一个 date 就是 某一天,按日期去取,这个就是 get fundamentals。 这两种取法的区别, 第一种我们就是用 date 取某一天,那也就是在这某一天,我们最近的一个报告期,还有一个报表 report types, 就是 报告期依旧是第一季度, 也就是说二零二零年六月一日以前最近的一个一季度的报表。那假如我们这边是二零二零年二月一日或者三月一日, 其实我们取不到二零二零年的一级包,那我们就会去取二零幺九年的一级包,然后我们这边看一下第二个取法, get fundamentals, 这边前面都一样, 然后是某个表里面的某个字段,我们用的是 start year 和 end year 这样来取,通过取这两年他的一级包。好,我们看一下取出来的结果。 我们这边看第一个就是取出了二零二零年他的一季报,这边有一个发布日期, 这边是一季报的一个 end date, 一 季报嘛,就是最迟三月三十一日, 然后这边看到下面我们就获取了两年的一九年的二零年的获取财务数据,主要就是这个方法。接下来我们看一下如何获取账户信息。 获取账户信息我们用的方法是 context portfolio, 然后后面就是可以取 portfolio, portfolio 就是 账户信息里面有很多字段,我们这边取的是账户的资产情况,我们这边看一下具体 portfolio 下面一共有哪些字段。 可以看到 portfolio, 它提供了这些字段可以查询这些,大家可以后续自己一个一个去试一下。 好,这边出来就是十万。好,接下来我们看一下持仓信息,持仓信息我们用的方法是 get positions, 然后呢就取某个股票, 这边我们就取到了 position 的 一个对象,这里面包含了很多字端,都是持仓的,一些字端 包括 amount, 它的一个持仓数量啊、成本啊都是。然后这边假如没有持仓,我们也是会返回来,也就是没有持有这个股票。 好,那回测中进行数据获取的方法就介绍到这里,下期给大家带来如何避免各类常见问题。包错,下期再见。拜拜。

哈喽,大家好,我是小亮,本期视频我们将一起来学习写一个实战型的回测策略,通过这个策略,我将带大家一起了解下貔貅的量化回测的整个框架和设计的一些接口和函数。 看这边我已经新建完成了一个叫做日线回测策略完整框架,这就是这个策略的代码,我都做了一些注示。这边可以看到第一个部分叫做初识化模块,第二个部分叫做盘前处理,第三个部分叫做盘中运行, 第四个部分叫做盘后处理。那这当中呢?因为上一个视频我们已经了解过一个最简单的策略构成情况,最简单的策略它只需要一个初设模块,就是 initialize 和 handle data 这两个函数, 也就是说盘前处理和盘后的一个处理,它并不是必须的。那其实在实际的策略设计过程中,像盘前处理是非常重要的, 那盘后处理呢?也可以按照个人的一个习惯,可能使用的频率并没有像盘前那么高,所以那我们就知道它一共四个模块,必须的就是初识化和盘中,同时盘前我们也是比较常用,那我们就一个模块一个模块来进行熟悉。 initialize 这个模块呢,主要是用来设定一些参数的初识化和对一些大局变量的设置, 这个模块他只会在策略的最开始运行一次,假如你回测从六月三号到六月四号,我这边设置了两天,那么他只会在六月三号最开始运行一次,到六月四号他就不会再运行了, 它里面设置了很多,那其实像这些设置也并不是必须的,你不设也是没有关系的,那我们实战角度来讲,像这个设置精准,这边默认是相当于给你的策略做一个精准的指数去设定一下, 你如果不设定,那他默认就是沪深三百,我们这边给他设成了一个上证五菱。接下来像设置佣金费率 set commission, 设定滑点比例,设定成交比例这几个函数。这几个函数 其实并不是说你一定要去设,那如果不设的话,我们会给默认值,但是大家也最好自己去做一个设定, 按照自己对回测要求的严谨性去设置。比如固定滑点,它是委托价格与最后成交价格的差价差,默认是零, 那其实零肯定不是一个实际的交易情况嘛,大家肯定也知道,所以大家在这些函数上面就设定的稍微大一点,这样会比较严谨一点,比较逼近于真实的交易情况,那你回测出来的有效期就会提高。 这边是一个滑点,默认是零点一,我这边设置零点二,然后成交比例,也就是说你这个策略在某一个周期内去下单的时候,不能超过整个市场这个周期内总成交量的四分之一,我这边设成了零点二, 这些都是为了让你的回测比较有效。然后最后你再那个盘前 before trading start 也可以去设置,那说实话就是用来设置这些固定的一些参数,接下来盘前处理。那为什么我们要做盘前处理呢?因为比如就像获取股票列表这个接口,因为我们知道沪深三百指数,它的成分股, 包括每一天市场的成分股,它都是在变的,假如我们把股票池在 indium 这个部分就给他做了一个固定的话,那么后面每一天 他处理的这些股票池都是固定的,他不会每天更新,但实际上这种就不是一个真实的交易场景, 所以我们每天都需要在盘前或者盘中去对一个股票池更新。那我们为什么要在盘前做呢?因为假如你是一个全市场的策略,在盘中做所消耗的时间是非常多的, 因为几千只股票处理数据会非常慢,所以我们是在盘前跑。盘前我们这边默认是在每天九点十分运行一次, 那离九点半还有很长的时间,这段时间内有足够的时间去做数据处理的一个动作,所以我们建议就是在 before trading start 进行处理。这边我们简单做一个示意,看在盘前会做哪些动作。常规的动作啊, 这边是设置了一个沪深三百的股票池,然后呢我们通过一个 getstock status 接口, 可以把 st 的 停牌的、退市的这些股票,它们的一个状态我们都取出来。我们这边做了三个变量的赋值, 然后把这三种状态下的股票全部剔除,从这个股票池里面剔除。这样的话我们就可以每天只做一些非 s t、 非停牌、非退市股票的一个交易,这就是逼近真实的交易场景。再接下去我们就可以,因为我们做交易 大多数的策略都需要历史数据嘛,所以我们也可以在 before trading start 这个盘前处理的环节,我们把数据都准备好,这边有一个函数是 get history, 这就是获取历史数据。 close 是 一个收盘夹,这边是成交量,我们把它取出来,然后这里进行一个处理,我们先略过,通过这边再一个便利,我们把停牌的股票数据过滤掉, 假如非停牌的日期小于十,那我们就把这个股票从股票池里面剔除。那通过一个历史停牌数据的过滤,我们就把每一只股票历史收盘价的一个数据存在一个全局变量的字典里面,这就是在 before trading start, 然后我们再对过滤完的股票池 进行一个 set universe 设置,那我们在盘前的处理就全部结束了。也就是说,我们在盘前把数据和要交易的股票列表 和这些股票所对应的一些历史行情数据都已经存储好了,然后我们就开始进入盘中运行, 也就是我们计算的一个主逻辑的处理过程。盘中运行 hanodata 这个函数我们是必须要用,必须要写,你如果不写呢?也可以,如果你到 before trade start 就 结束了,那你可以用一个 pass, 那 就不会运行,也不会报错。 你如果不运行,不写这个 hanodata 系统是会报错的。那这边我们就写了一个简单的逻辑,今天上川十日均线的股票买入两万元, 那我们就是对所有的股票进行一个便利。处理完了以后,我们最后再看一下 after trading end, after trading end 因人而异,大家如果在盘后希望去做一些统计,那可以在这部分做, 我们这里就做为了演示,简单就打印一下当日的成交结束以后的一个持仓情况 好了,那我们这四个部分就在写完了,然后看一下,这里一样的有一个回测时间和一个设置初使资金的批准和周期。这里强调一下, 如果按日,那我们这个策略,他每天是在下午三点会进行所有的一个处理,所以他在盘中是不会有打印的, 那也就是说 hello data 这个函数,它只会在三点整进行一次运算,这个就是日线回测的完整框架,那我们就进行一次回测,看一下情况 好了,这边可以看到已经运行结束了,运行结束我们可以看到有委托日制, 我们都是在三点进行一个打印,这里三点半是 after trading and 盘后处理,这边有一个持仓股列表的打印, 这里看到我们就买进了两只股票,那这就是一整个框架的介绍,这就是日线回测。那这边我们再试一下,假如我们调成分钟,那会是怎样的 分钟,整个都一样,只是对 handle data 进行了一个小改动,就是只会在每天的第一分钟进行一个逻辑预算, 那我们这边就是需要把它改成分钟了。前面的 initialize 和 before trading start 还有 after trading end 我 们都没有进行改动,我们这边进行一个回测,大家看一下。 好,我们这边可以看到它的一个打印时间是在九点三十一分,那也就是 handle data 在 九点三十一进行了一次预算处理,然后到下午三点半 进行了一个 after trading end 的 处理。通过这两个案例,大家应该能够理解怎么样去写一个日线的策略和一个分钟的策略进行回测。主要不同点是进行一个周期的选择,以及在 handle data 中进行逻辑的处理。 本期就到这里了,下期给大家带来如何获取各类回测数据,我们下期再见,拜拜!

我们直接来看一个更硬核的案例,四,因子加权排名选股策略。这个策略的核心在于如何从巨宽迁移到批吹的,特别是处理那些复杂的因子数据获取。 先快速过一下这个策略本身。它是个经典的多因子模型,目标是全市场 a 股,但会剔除掉科创板、创业板、 st 和四新股这些相对特殊或风险较高的标的。核心是四个因子, roe t t m, 也就是净资产回报率越高越好,占百分之十五。权重 总市值越小越好,占百分之二十,收盘价越低越好,占百分之十五。以及现金流收入比衡量经营现金流与营收的关系越高越好,权重高达百分之五十。这最后一个因子权重最大,体现了对真实盈利能力的重视, 最终是把每个因子单独排名乘以权重求和,总分越低的股票越优。调仓节奏很明确,每天盘前更新列表,早盘执行交易,下午收盘前检查涨停情况。 好!现在来看,迁移的第一道坎,在巨宽里获取因子数据简直不要太方便,一横 get fetish 就 能搞定指定股票列表,因子列表截止日期返回一个包含所有股票所有因子数据的 dat 方。你看,代码简洁明了,效率极高。但是 到了 ptr 的 这边,你会发现没有对应的官方接口,这意味着什么?意味着我们不能简单的复制粘贴代码,必须另起炉灶,用 toshire 这个第三方库来从零开始搭建一套完整的因子获取体系。这可不是小事,挑战才刚刚开始, 我们尝试用 to 十二来替代,但很快发现 to 十二的因子数据分布很散,而且存在限制,比如总是值 market cap 在 daily bc 接口中可以批量获取没问题, 但是像 r o, e, t, t, m 和现金流收入比 cash rate of schuster 这两个关键因子,它们藏在 finn if niger 接口里,而且这个接口不支持批量查询。这意味着,如果你想用 toshar 获取这两个因子,你得一只股票一只股票的去查。 这下麻烦大了,因为巨宽那一行代码就能搞定的事情,现在变成了需要便利几千只股票的任务。显然,这不是简单的 api 替换能解决的。我们必须设计一个更复杂的数据获取框架。 第一个坑来了,而且是个非常隐蔽的坑。我们的转换器最初生成的代码格式转换成巨宽的格式。 你看, two share 的 six l cells 被转换成了 six, l, x, s, h, g, 但是 p trade 识别的是 s 和 s c 格式。 结果就是,当代码试图用巨宽格式的代码去匹配 p trade 系统里的股票时,完全对不上号。 最开始,我们用反算 r o e 的 方法从 del bis 获取了一千八百七十六只股票的数据,结果因为代码格式问题,这一千八百七六只股票的 r o e 数据全都没了,匹配结果是零只。 这简直让人抓狂。修复很简单,把那个转换函数改成直接输出 p trade 需要的 s, s 和 s z 格式就行了。 但这事告诉我们,代码格式转换这个看似不起眼的基础环节,如果出错了,会导致整个数据管线静默失败。没有任何报错,只是你的数据突然就没了。解决了代码格式问题,我们转向 finn 一 丁的这个接口。 理论上, toshares 允许通过 period 或 end date 参数进行批量查询,不用指定具体的股票代码。但我们实际测试发现,这几种批量方式全部失败, 有的提示访问频率过高,有的干脆说缺少必填参数次扣。究其原因,是 topher 不 同积分等级的用户权限不一样,有些账户压根就不让你用批量方式查询 finn e fender。 那 怎么办?只能退而求其次,阻止股票查询。 我们写了第一个版本的代码,对每一只股票都调用一次 finnahand, 结果呢?成功率只有可怜的百分之四十二,五百只股票只成功获取了二百幺二只的数据。为什么? 因为 two 十二的 api 有 隐性的限流机制,你连续快速的请求,它就会把你挡在外面。面对 two 十二的限流,我们不能坐以待毙。 于是我们设计了一个动态限频策略,核心思想是监测连续失败的次数,一旦连续失败达到一定预值,比如五次,就认为触发了限流,暂停一小段时间,比如二秒,让服务器的访问窗口重置。同时,我们还加入了重试机制, 第一次查询如果失败了记录下来,等主循环结束后,再对这些失败的股票进行第二轮查询。这时候可以使用更保守的间隔,比如零点二秒。 你看这个逻辑有点像打游戏遇到 boss, 连续攻击几次没效果,就得换个姿势,或者稍微等一下,再继续。通过这套动态限频加失败重试的组合权,最终的查询成功率从百分之四十二提升到了百分之八十二以上, 这大大提高了数据获取的稳定性和效率。当我们满怀希望地用逐枝查询 finn e dinger 获取数据时,又遇到了第三个坑。 我们发现返回的 data from 里竟然没有我们想要的 rotatum 列,这是怎么回事?原来 topher 的 不同积分等级提供字段也不一样,某些账户压根就没有 rotatim 这个字段。 那策略还怎么跑?难道要放弃?当然不,我们想到了一个反算法,我们知道 r o e 等于净利润除以净资产,而 pb 市净率等于市值除以净资产 p e t t m 市盈率 t t m 等于市值除以净利润。所以 ro 约等于 pb 除以 p t t m。 这个公式虽然不是精确等价,但在很多情况下足够近似的。幸运的是, daily basic 接口提供了 p team 和 pb, 并且支持按 trade date 批量查询。于是我们用这个接口获取了这两个指标,然后现场计算出 rocuscock。 这一招果然奏效,成功为两千八百七十六只股票补充了 r o e 数据。这再次证明,在数据受限的情况下,灵活运用已有资源和数学知识,往往能找到出路。 解决了单个因子的问题,我们再来看整体效率。我们知道逐只查询 finner 获取 cash already of 这种因子速度很慢,大概零点零伏秒一只。 如果我们对全市场的三千多只股票都这么做,总时间会超过二分钟。而在 ptr 的 巴尔执行环境中,通常会有个超时限制,大概也是二分钟左右。 这意味着,如果你的因子获取代码跑太久,整个策略可能就直接挂掉了。怎么办?我们引入了两步筛选法。第一步,先做快速预筛。 我们只用那些容易获取的因子,比如反算出来的 row team, 来自 daily bleed 的 market cap, 再加上收盘加 close, 用这三个因子槽快速做一个排名,选出 top 五排的股票。 注意,这里的权重和最终的权重不一样,因为我们缺少了现金流因子权重分配做了调整。 第二步,慢速精确筛选。我们只对刚才筛选出来的五百只股票,再去逐只查询那个慢速的 cash。 因此 这样原本需要对三千多只股票进行的慢速查询,现在只需要对五百只股票进行,时间一下子就从二分钟以上降到了大约二十五秒左右,完全避开了 ptr 的 超时陷阱。 最后一步,就是把这五百只股票的所有四个因子数据合并起来,按照原始的十五百分之十五百分之五十权重进行最终的加权排名,选出我们想要的 top 三十股票。 这个两步筛选法可以说是这次迁移中非常关键的一个优化点,它不仅保证了策略能跑完,还保证了能在规定时间内跑完。 除了单次运行的效率,我们还要考虑回测的效率。一个完整的回测可能要跑几百个交易日。如果每个交易日都重新查询 finetinder, 哪怕用了两步筛选,也还是太浪费时间了。 这里有个关键观察财务数据,比如现金流收入比,通常是季度发布的,一般在每个季度末公布。 在一个回测年份内大部分交易日的财务数据其实是相同的。基于这个观察,我们引入了季度缓存机制。我们建立一个缓存字典,用年份和需要查询的因子列表作为缓存的 key。 只有当第一次查询某个年份的特定因子组合时,才真正去调用 api 获取数据并存入缓存。之后在这个年份内的其他交易日直接从缓存中提取数据即可,无需重复查询。 这样每个回测年份只需要查询一次 finna finnander, 后续交易日几乎零成本获取数据,效率提升非常明显。 现在,我们把前面提到的所有环节整合起来,看看最终的完整数据获取流程。整个过程就像一个流水线,首先从全市场股票中筛选出基础池,剔除掉不需要的标地, 然后进入核心步骤,利用 delibsy 接口快速获取 roddim 和 market cap, 再获取收盘价,用这三个因子进行快速预筛选出约五百只股票。 接着对这幅本质股票通过 finna eventetter 逐只查询 catchrat of shell。 在 这个过程中,我们采用了多种查询方法,优先尝试批量查询,其次是日期范围查询,最后才是逐只查询,并结合了动态现频策略来应对 toshar 的 限制。拿到所有四个因子的数据后,进行最终的加权排名,选出后选股票。 这个流程图清晰地展示了从海量数据到最终结果的每一步骤和决策点。我们把这次四因子策略迁移过程中克服重重困难积累的所有经验和技巧都沉淀了下来,并且同步更新到了 gpu trade 转换器的模板代码中, 这意味着什么呢?意味着以后你再用这个转换器去迁移任何涉及到 get file flash 的 巨宽策略时,下面这些能力会自动注入到你的代码里。比如,它会自动处理代码格式转换,确保用的是 ptr 的 需要的格式, 它会自动帮你反算 r o e。 它内置了我们前面讨论的多方法查询策略,从批量到逐只,它有动态限频和重置机制,还有季度缓存来提高回测效率。所有这些都不需要你手动去修改代码了,转换器会帮你搞定。 为了让大家更直观地感受到这次模板的进化,我们来看一下更新前后的对比。更新前的模板逻辑比较简单粗暴,就是尝试用 period 的 参数批量查询 finna fender, 只要成功拿到一个季度的数据就 break 掉,不再尝试其他方法。 这种方式很脆弱,一旦批量查询失败,就没了退路,也无法利用缓存。而更新后的模板逻辑就复杂和强大得多。 他首先会检查是否有缓存,如果有,直接用,如果没有,他会依次尝试三种方法。第一种是尽可能多地累积四个季度的数据,不会中途停止。 第二种是尝试用日期范围查询。第三种,如果前两种都没拿到数据,而且股票数量不多的话,才会起用。逐只查询,并且带有动态限评和重试机制, 拿到所有数据后合并起来再存入缓存。这种多方法累积降级缓存的策略显然更加健壮和高效。 为了确保我们辛辛苦苦迁移出来的 p 吹的版本是正确的,我们还把它和原来的巨宽版本进行了逐行对比验证。 大家看这张表,从策略参数、选股逻辑、因子权重、调仓、时间过滤、规则、行业集中度到涨停处理,这些核心配置项在两个版本中都是完全一致的。 唯一的差异主要体现在数据获取方式上,一个是用巨宽的 j p factor, 一个是用 tushir, 这自然导致了因子覆盖率的差异, 巨宽那边几乎是全覆盖,而 ptr 的 因为 api 的 限制,覆盖率大概在百分之八十二左右。但除了这个,策略的核心逻辑和配置都保持了高度一致, 这给了我们信心,迁移是成功的。这次四因子策略的迁移之旅,让我们深刻体会到了从巨宽迁移到 ptr 的 深层痛点,那就是数据接口的巨大差异。 这绝不仅仅是换个 api 名字那么简单,很多时候需要我们彻底重构数据获取的架构, 但挑战也带来了收获。我们总结了几点核心经验,第一,代码格式是基石 adx s a g 和 s s 的 区别,它可能让你的数据凭空消失。第二, api 权限千差万别 to share, 不 同等级级的用户能用的功能不一样,不能想当然。 第三,批量到逐只的降级策略是必备的,总有一款适合你。第四,动态限频是应对限流的利器,固定延时根本不够看。第五,两步筛选法能有效减轻 api 压力,先快后慢,事半功倍。这些都是实打实的干货。 最重要的是,我们已经把刚才提到的所有这些宝贵经验都封装进了 j 曲屁 tree 的 转换器的最新版本里, 这意味着从今天开始,只要你用这个转换器去处理那些依赖 get 发 pals 的 巨宽策略,它就会自动帮你完成代码格式转换、 roe 反算、多方法查询、动态限频、季度缓存等一系列工作, 你不需要再手动去操心这些细节。开源的目的就是希望能帮助更多人顺利地完成策略迁移。 关于聚宽道劈 tree 的 因子数据迁移,特别是这个四因子策略的实战案例就分享到这里,希望能给大家带来一些启发和帮助,谢谢大家!