很多投资者都有一个愿望:希望能够按多个步骤来选股,在每个步骤可能需要对不同指标因子进行排序,将排名靠前的若干只股票选入股票池;同时在每个步骤中,还可能需要使用不同的数据周期,比如有时候使用日线,有时候使用30分钟线;而且需要历史每天都能按这个步骤选出历史当日的股票池,不单单只能选出最近当日的结果。
易得程序化可以只需要一条公式就能满足您的以上愿望,还能将历史每天的选股结果构建成选股策略的指数,将选股策略指数化,历史每天的选股结果就是这个指数历史每天的成分股。
在每天收盘后,易得程序化还能对这个指数按选股策略重新换股,也就是按选股策略调整指数的成分股。这样在第二天开盘的时候,系统将按最新选出来的股票池作为指数调整后新的成分股,在盘中实时刷新计算该指数。投资者只需要跟踪该指数的走势即可评估该选股策略的收益表现。
最后,易得程序化可以将选股结果按各个PB系统的格式导出一篮子股票,将篮子股票快速导入PB系统完成下单交易。
简单来说,易得股票池多步选股完成了“策略多步选股 -> 构建选股策略指数 -> 生成篮子 -> PB系统下单”的一条龙的选股服务。
股票池多步选股是易得程序化的王牌,是一款颠覆性的选股工具,引发了投资者将更多的精力花费在选股上,而不只是在择时策略上。
比如我有一个想法,希望能使用一个公式完成四个步骤的选股:
第一步:综合选股,将沪深A股作为样本,首先将ST股票、日线收盘价格低于3元或者高于80元,昨日涨幅大于5%的股票过滤掉。
第二步:贝塔系数选股,在日线数据周期上,对每只股票与沪深300指数的贝塔相关系数进行归一化排名,淘汰低贝塔个股,选出系数最大的50%的股票进入股票池。
第三步:周线乖离率选股,切换到周线数据周期,对12周期乖离率进行排序,从上一步结果中选出排名靠前的400只股票重新进入股票池。
第四步:市值选股,选出流通值排名最低的60只小盘股作为最终的股票池。
大家可以看到,第一步只是在日线上过滤掉一些ST股和高价股,这个看起来很简单。在第二步的时候,要对每只股票跟沪深300指数对应日期的贝塔相关系数进行归一化排名,这时就不知道怎么办了。第三步就更要命了,要马上切换到周线,按乖离率进行排序,按排名从上一步结果中筛选出排名靠前的400只股票。第四步选出流通值最低的60只小盘股作为最终的股票池。这时,大家肯定抓耳挠腮,不知如何是好了。
好吧,易得程序化的股票池多步选股就是专门来帮您解决这一系列问题的。只需要一个公式短短50行的代码,就能通过一键选股快速解决您上面的所有问题。
下面我们先来看看这个多步选股公式该怎么写吧:
1. input:低价(3), 高价(80);
2. input:二选留比(50), 三选留数目(400), 终留数(60);
3. // 样本空间: 沪深A股; 使用数据周期:日线
4.
5. // 第一步: 综合选股,将ST股票、低价股、高价股、涨幅大于5%的过滤掉。
6. function strategy1
7. begin
8. 非s股 := issts=0;
9. 价区 := between(oclose, 低价, 高价);
10. 一选条件 := c/ref(c,1) < 1.05 and 非s股 and 价区;
11.
12. poolselect(一选条件); // 将满足一选条件的选入股票池
13. end
14.
15. // 第二步:贝塔选股
16. function strategy2
17. begin
18. c300 := "sh000300$close"; // 引用沪深300的收盘价数据
19. 二选条件 := 100 + beta2(c, c300, 10); // 收盘价与沪深300的10周期贝塔系数
20. 二选排名 := normalize(二选条件, 1); // 对二选按降序进行0-1000的归一化排名
21.
22. // 将股票池中二选排名前50%的选入新股票池
23. poolbetween(二选排名, 0, poolnumber*二选留比/100);
24. end
25.
26. // 第三步: 周线乖离率选股
27. function strategy3
28. begin
29. limitcycle:week; // 限定周线周期
30.
31. ma12 := ma(close, 12);
32. 三选条件 := (close - ma12) / ma12 * 100; // 12周期乖离率
33. 三选排名 := ranking(三选条件,0); // 将二选条件按升序从小到大自然排序
34.
35. poolbetween(三选排名, 1, 三选留数目); // 将三选排前400名的选入新股票池
36. end
37.
38. // 第四步: 流通值选股
39. function strategy4
40. begin
41. 四选条件 := capital * c;
42. 四选排名 := ranking(四选条件, 0); // 按流通值升序排名
43. poolbetween(四选排名, 1, 终留数); // 取流通值最小的60名作为最终股票池
44. end
45.
46. // 公式从此处开始执行
47. ignoresuspend(1);
48. intervalbars(1);
49.
50. strategy1; // 调用自定义函数strategy1
51. strategy2; // 调用自定义函数strategy2
52. strategy3; // 调用自定义函数strategy3
53. strategy4; // 调用自定义函数strategy4
注意:以上示例公式第二步选股条件计算沪深300的贝塔系数,需要提前准备好沪深300的日线数据,否则选不出股票。该示例只作为多步选股公式编写的教程范例,仅作学习之用,不作为实战选股策略。
我们看到,这个选股结果列出了历史时间每天的60只股票的选股结果。
通过上面的示例,我们看到想要熟练掌握多步选股的使用,首先还得学会编写股票池多步选股公式。细心的读者可能已经注意到,我们将选股的每一个步骤都封装在一个自定义函数里面,在这个自定义函数中,我们完成了数据周期切换、策略实现、排序、入池等操作。所以掌握自定义的函数的使用也是相当重要。
对于自定义函数的使用,我们在易得公式系统介绍有专门章节详细介绍了自定义函数的使用说明。这里我们简单帮读者回忆一下自定义函数的基本构成。
function MyFunc(x,n)
begin
a:=x*n;
return a;
End
Mul:MyFunc(c,5);
上面代码中我们定义了一个名为MyFunc的自定义函数,有X、N两个参数。function是系统关键字,自定义函数必须以function声明。begin/end组合块指明了自定义函数的范围,包含在里面的代码都属于该自定义函数的代码范围。return是自定义函数的返回语句。自定义函数需要调用才会被执行,调用自定义函数就跟普通的函数一样调用,上列是MyFunc(c,5)。
下面我们还是按上一节的示例来详细学习多股选股公式的编写方法。
input:低价(3), 高价(80);
input:二选留比(50), 三选留数目(400), 终留数(60);
这2行代码定义5个公式的参数,我们可以使用中调整这些参数。
// 第一步: 综合选股,将ST股票、低价股、高价股、涨幅大于5%的过滤掉。
function strategy1
begin
非s股 := issts=0;
价区 := between(oclose, 低价, 高价);
一选条件 := c/ref(c,1) < 1.05 and 非s股 and 价区;
poolselect(一选条件); // 将满足一选条件的选入股票池
end
我们将第一步选股策略封装在自定义函数strategy1中,从第一个begin语句开始,到与这个begin配对的end结束。
对于前面的一选条件都很常见,这里主要是poolselect函数。将满足一选条件的个股选入股票池。
// 第二步:贝塔选股
function strategy2
begin
c300 := "sh000300$close"; // 引用沪深300的收盘价数据
二选条件 := 100 + beta2(c, c300, 10); // 收盘价与沪深300的10周期贝塔系数
二选排名 := normalize(二选条件, 1); // 对二选按降序进行0-1000的归一化排名
// 将股票池中二选排名前50%的选入新股票池
poolbetween(二选排名, 0, poolnumber*二选留比/100);
end
第二步选股策略封装在自定义函数strategy2中,主要是了解normalize和poolbetween函数。normalize进行0-1000的归一化排名,归一化排名是按排序后的样本映射到[0,1000]这个区间内。poolbetween将这个排名中的指定区间的样本选入股票池。
// 第三步: 周线乖离率选股
function strategy3
begin
limitcycle:week; // 限定周线周期
ma12 := ma(close, 12);
三选条件 := (close - ma12) / ma12 * 100; // 12周期乖离率
三选排名 := ranking(三选条件,0); // 将二选条件按升序从小到大自然排序
poolbetween(三选排名, 1, 三选留数目); // 将三选排前400名的选入新股票池
end
第三步选股策略封装在自定义函数strategy3中,limitcycle将该自定义函数执行的数据限定到周线,limitcyle必须出现在自定义函数的第一条语句,因为限定的数据周期适用于整个自定义函数的范围,所以必须放在第一条语句。该自定义函数退出后,limitcycle限定的数据周期失效,重新回到之前执行的数据周期。
Ranking是将股票池内的样本数据进行自然排名。以便后续的poolbetween语句根据该排序选股入池。
// 第四步: 流通值选股
function strategy4
begin
四选条件 := capital * c;
四选排名 := ranking(四选条件, 0); // 按流通值升序排名
poolbetween(四选排名, 1, 终留数); // 取流通值最小的60名作为最终股票池
end
第四步选股策略封装在自定义函数strategy4中,这里语法基本跟上面相同。
代码从上至下到这里,其实上面的四个步骤的自定义函数都没有执行。需要后面的代码来显式调用。
// 公式从此处开始执行
ignoresuspend(1);
intervalbars(1);
strategy1; // 调用自定义函数strategy1
strategy2; // 调用自定义函数strategy2
strategy3; // 调用自定义函数strategy3
strategy4; // 调用自定义函数strategy4
上面的代码才是该公式的真正起始点,ignoresuspend指明选股是否忽略停牌股票。intervalbars指明了股票池换股的间隔周期,如果intervalbars的参数设为了2,那么股票池选股需要隔一个周期才执行换股操作;如果设为了1,意味着每周期(每天)都换股。
最后4行我们看到显示调用了4个自定义函数,这时候选股的4个步骤才开始执行。
选股的每个步骤一定要放在自定义函数中吗?其实也不是,只是如果你要使用LimitCycle来切换限定数据周期类型,就必须使用自定义函数,因为LimitCycle语句一定要放在自定义函数的第一条语句。如果您不需要切换数据,按一般指标公式那样按过程先后写在一起也就是可以的。
但我们建议每个步骤都放在各自的自定义函数中,因为这样写程序代码就更加结构化,更具可读性,后续也更好维护修改。
在管理面板的公式树上,有专门的“股票池多步选股”类型。在该类型下新建的公式,都属于“股票池多步选股”类型。
对于多步选股公式,编写方式跟其他公式类型的编写方法基本一致,差别在于多步选股公式可以设定默认的样本空间。
更多股票池多步选股公式编写示例,请参考系统自带的多步选股示例公式进行学习。
下面我们列出股票池多步选股的函数详细使用说明:
LimitCycle |
数据周期类型限制 |
LimitCycle语句只能用在自定义函数中,并且只能放在自定义函数的第一行。 |
|
Normalize |
股票池品种归一化(0-1000)排序, 横向统计函数 |
该函数只能用在股票池多步选股公式中,用来将备选池的标的进行0-1000的归一化排序。 |
|
Ranking |
股票池品种自然排序, 横向统计函数 |
该函数只能用在股票池多步选股公式中,用来将备选池的标的进行自然排序。 |
|
PoolSelect |
按条件选入股票池, 横向统计函数 |
语法: |
|
PoolBetween |
将排序标的选入股票池, 横向统计函数 |
语法: |
|
PoolMod |
将排序标的从S名次起按隔N取M方式选入股票池, 横向统计函数 |
语法: |
|
PoolNumber |
当前股票池标的个数 |
语法: |
|
IgnoreSuspend |
股票池横向统计忽略当日停牌标的 |
语法: |
|
IntervalBars |
股票池选股周期频率 |
语法: |
|
PoolTradeFee |
股票池换股费率 |
语法: |
编写好了多步选股公式,我们就可以进行选股并构建选股篮子和选股指数了。
有两个方式,一是通过公式树选中股票池多步选股公式,通过右键的“构蓝建指”;另外一个是通过主菜单的“策略”-“股票池多步选股”按钮。
进入股票池多步选股主界面,选择多步选股公式,设置好参数、运行数据周期、时间基准品种等配置后,点击“刷新计算”,可以快速计算出选股结果。
注意:股票池多步选股是在本地进行的,所以在选股前必须保证各样本空间的数据完整,可以通过数据下载补充数据。
在界面下方我们看到有两个列表,左侧的是每个历史数据的日期,右侧的是每个历史日期的选股结果明细。
品种范围也就是股票池的初始样本空间,这里可以重新设置。
时间基准品种是个非常重要的概念,我们的选股依赖于该品种的时间轴时间,一般选择指数,因为指数不会停牌而导致时间缺失。
涨幅列设置,我们可以设置每个周期选股后次N周期的涨幅,并在选股列表中显示。这样我们可以快速直观地看到历史每周期选股后的表现。
自动补齐当日数据、自动补齐历史数据,勾选后在选股前会自动下载样本空间的品种数据,方便用户避免数据不完整导致的选股误差。
历史阶段选股,勾选后是按指定历史日期进行选股,不勾选仅做最新当日的选股。
导出板块、加入板块能将当前选中时间的股票池导出到文件或者加入系统板块。
通过以上章节我们已经学会了怎么编写股票池多步选股公式,并能执行选出股票池。下面我们来学习如何创建选股指数,与选股公式进行绑定,将选股策略指数化。
在完成选股后,点击“选股指数”按钮,出现了下拉菜单,点击“新建选股指数”即可进入自定义指数界面构建选股指数。在后续还可以通过“修改指数设定”来进行设置的修改。
见上图下拉菜单的下方有刷新历史各种数据的按钮,系统将根据历史阶段每天选股的结果刷新计算指数的历史数据。这里需要指出的是:选股指数刷新的历史数据是按每天选股的结果作为每天的成分股,也就是计算的时候历史每天的成分股都会换股的。这一点也是选股指数跟板块指数的区别,板块指数刷新计算历史数据的时候只能按当前设置的成分股并一直保持不变;而选股指数根据历史每天的股票池,计算历史指数数据的时候每天的成分股是会变的。
见下图,设定选股指数的界面中,我们可以看到下方有选股公式和样本空间范围的选项,这里会自动带入,当然也可以根据需要进行修改。选股指数的代码都是以“XG”打头。
其他设置跟板块指数相同。
创建好选股指数后,见下图,我们可以在动态显示牌的“指数”-“选股指数”中列出所有选股指数,通过右键菜单我们可以修改指数设定、删除该选股指数、刷新选股指数。在这里动态显示牌的刷新选股指数中,我们看到只有“刷新当日分时”的按钮,因为这里没有历史阶段每天的选股结果,所以不能刷新历史的数据。只能在“股票池多步选股”的选股结果中刷新历史数据。
在这里,您就可以跟操作一只股票一样,对选股指数进行各种操作。
凡是选股指数,都会在板块指数市场进行收盘作业的时候,对选股指数按选股策略进行换股。
易得程序化的收盘作业是可以配置的,在主菜单“工具”-“数据管理”中,可以勾选需要进行收盘作业的市场和数据周期类型。只有勾选了板块指数市场的收盘作业,才会执行收盘换股。因为所有的自定义指数都属于板块指数市场。见下图。
另外有一点需要指出的是,选股公式中通过INTERVALBARS(N)函数可以指定换股的间隔时间,如果这里设定了也会最终决定是否进行换股。
如果您在设定选股指数的时候设定了“盘中实时刷新”,每天在盘中的实时行情中都会自动刷新计算该选股指数的实时行情数据。就跟交易所播出的指数一样。
在选出多步选股结果后,我们也可以构建篮子了,篮子构建好后,我们就可以直接将选股结果导入PB系统进行下单交易。
在多步选股界面,点击“构建篮子”按钮。
当然,我们可以在板块树中对任何板块构建篮子,这个就看使用者根据自己的需要随意使用了。
在构建篮子的界面,我们看到左侧是模板区,右侧是选中模板的各种篮子格式。我们先来介绍一下右侧的篮子格式。
篮子格式是指输出到各个PB系统的篮子文件的格式,以及它们的资金分配方法,可以随意添加。添加好后我们勾选其中一个或多个格式,点击“生成篮子”即可按篮子的设置和格式,输出篮子文件。
添加格式、修改格式、删除格式就是对篮子格式的增删改操作。下面我们来看看篮子格式的设置吧。
篮子格式设置了该篮子面向的PB系统,将按各PB系统的格式生成篮子导出文件。目前支持的PB系统有:恒生数量、恒生比例、通赢、通达信、迅投、名策。后续可以根据需要扩展对更多PB系统的适应。
其中恒生数量、恒生比例是恒生PB系统的两种格式,一个直接指明个股数量、一个指明个股比例。
总金额:是指该篮子下单的总金额。
分配方法:等额、等量、流通盘比例三种。
停牌品种:可以设置停牌品种是否分配资金。如果停牌品种不分配资金,总资金会分摊到其他非停牌个股。
零股处理:对于不是整手的分配,按四舍五入、向上取整、向下取整三种处理办法。
不足1手:对于不足1手的分配,按取1手、取0股两种处理办法。
输出文件类型:支持txt、csv、xls三种格式。
可以将多个篮子格式封装成一个模板,这样方便快速管理各种篮子格式。模板可以增删改、导入导出等操作。见下图左侧的模板操作菜单。
也可以将当前的篮子格式另存为一个模板。
篮子模板的创建除了可以指定名称外,还可以绑定一个或多个公式,这样的好处是当多步选股需要导出篮子的时候,能根据多步选股的公式自动快速显示绑定的模板,可以提高使用者的工作效率。见下图。
在构蓝篮子页面,我们可以为各个导出的篮子创建篮子指数,将篮子交易指数化。后续可以根据篮子指数的走势来跟踪该篮子的收益表现。
在生成篮子后,我们可以点击“篮子指数”按钮的弹出菜单,来新建篮子指数、修改篮子指数设定、以及刷新篮子指数。
我们看到篮子指数的指数类型只能是“自定义”类型,它根据篮子格式的资金分配方法来设定各个成分股的股本,以个股价格*股本作为成分股的权值。这个是篮子指数跟其他自定义指数的区别。篮子指数的代码都是以“LZ”打头。
创建好篮子指数后,见下图,我们可以在动态显示牌的“指数”-“篮子指数”中列出所有篮子指数,通过右键菜单我们可以修改指数设定、删除该篮子指数、刷新篮子指数。
在这里,您就可以跟操作一只股票一样,对篮子指数进行各种操作。