更新日期:2017-01-23 增加系统指标的说明   QQ讨论群: 点击加群

果仁选股策略--FAQ

1.果仁提供什么服务?

果仁网用户可以在几个鼠标点击内定制自己的量化选股策略。果仁策略可以帮助用户从数千只股票里挑出在未来更有可能赚钱几只或几十只股票。果仁策略的有效性在真实的历史数据得到测试。策略的历史收益将和沪深300等收益基准做对比, 帮助您判断股票策略是否成功。 策略一旦创建,策略的实盘收益将被自动计算出来。果仁策略会在每个调仓日自动产生股票调仓指令,以指导用户具体的股票买卖。

在共享策略里,您可以研究学习其他用户创建的策略,分享自己的策略,和社区的朋友们共同讨论提高。在策略商城里可以订阅跟随他人的精品策略,跟随交易。

2.这种选股方法真的能赚钱吗?

基于量化指标的回测统计方法在中国远没有得到广泛使用,大多数投资者采用跟风投资或K线图形的策略。也正因为很少有人用这种方法买卖股票,这种方法在中国更加高效。在欧美市场,量化统计已经被很多聪明人研究透彻,这造成一般量化策略有效性降低,击败大盘指数是件不容易的事情。而在中国,一个相对简单的量化选股模型就有可能轻松跑赢大盘。

3.量化投资就是高频交易吗?

不是。量化投资是基于量化统计模型的一种投资方法。其核心步骤是将量化模型放回真实的历史数据模拟跑盘,以验证量化模型的有效性。 量化投资可以做日内高频交易也可以做日间低频交易,只要是基于量化模型统计的投资方法都是量化投资。果仁支持日间股票买卖量化模型,门槛低,即便是一般的投资者也可以使用。有兴趣的朋友可以读读丁鹏的《量化投资—策略与技术》了解一些量化投资的基本概念。在量化交易理念方面,科蒂斯.费思的《海龟交易法则》提供非常有意义的指导

4.果仁的量化策略买卖模型是什么?

果仁策略默认的交易模型(模型I)是一种定期调仓的量化轮动模型。在每一个调仓日, 果仁策略卖出仓内的所有股票, 并依据调仓日前一交易日的数据,选出股票等权重买入。如果选出的股票已经在仓内, 这支股票的仓位也会被重新调整成和其它股票一样的仓位, 但如果这只股票因为停牌或涨停跌停无法调整仓位,则仓位保持不变。 这种买卖模型比较简单,适合轮动交易策略。

果仁交易模型II是一种按卖出条件调仓的的量化轮动模型。在每一个调仓日,卖出满足卖出条件的股票,把余下的资金等权重买入符合买入条件的新股票。不满足卖出条件的股票可以保持自己的仓位, 在规定的仓位范围内不作调整。模型II分离买入和卖出条件, 是一种更加灵活的交易模型。

5.选股指标的数据从哪里来?何时更新?

选股指标(除了分析师预测指标外)是果仁根据原始市场数据和公司发布的财报自己计算出来的。具体的计算方法在选股指标里有解释。

数据日期范围:大多数指标从2007年1月4日开始, 用户可以使用历史查询功能来判定任一股票的指标日期范围。股票数据每晚10点完成更新, 基金数据到第二日早9点完成更新。

6.果仁股票行业分类标准是什么?

果仁依据申万2014版一类行业标准对股票进行分类。

7.果仁历史回测真实吗?

为了做到回测的真实性,果仁回测引擎作了如下处理:使用精准的(point-in-time)历史数据, 彻底回避了使用未来信息的隐患;对停牌和涨跌停股票的买卖限制做出真实处理;对交易成本进行合理估算。历史回测结果可以全部导出到Excel文件里,方便验算。 经过许多细心用户的验证, 果仁历史回测结果是真实可靠的。

8.筛选条件和排名条件各有什么用处?

果仁使用“先筛选后排名”的选股流程。 当选股策略既有筛选条件又有排名条件时,筛选条件将首先被使用,从几千只股票里选出一批股票做为候选股票,然后排名条件将被用来对这些候选股票做出排名,排名最靠前的N只股票将被买入(N是最大持仓股票数)。

有些用户喜欢使用复杂的筛选条件精选出少量股票,再使用一个简单的排名条件对这些股票排名;另一些用户喜欢使用简单的筛选条件粗选出大量股票, 再使用较复杂的排名条件对这些股票进行精准的排名。 从实际的效果来看,使用排名条件可以实现更加精细的选股策略,所以我们建议用户首先使用筛选条件对股票进行粗选,再使用排名条件对选出的股票进行细致排名,最后选出最靠前的N只股票进行投资。

11.策略收益的具体计算规则是什么?

策略收益根据回测日期区间和调仓周期来计算。每个周期的收益单独计算,最后策略的总收益是各个周期的收益累积而成, 即(1+周期1收益)×(1+周期2收益)×。。。 = 1 + 总收益。调仓日是在每个周期的第一天, 股票买卖价格按照调仓日的价格计算, 默认是收盘价。 每一个周期的选股日调仓日的前一天。比如一个调仓周期的第一天是T日,这个周期的调仓日就是T日,而选股日是T-1日。果仁收益计算包含股息,拆股和配股的收益。

在默认情况下, 策略会等权重全仓买入股票, 对每只股票的仓位不做限制。 比如策略只选出一只股票,则会用100%的资金持有这支股票, 如果选出2只股票, 则每只股票占用50%的现金,依次类推。 在每个调仓日, 回测程序都会自动调整仓位,把股票仓位重新设回到等权重的状态。

当有市场择时条件时, 用户可以限制熊市整体股票仓位,比如在50%。 这时,在每个熊市调仓日,回测程序都会把整体股票仓位设置为50%。

(如果用户认为用100%资金买入一只股票过于危险,可以在策略回测的高级设置里限制个股最大买入仓位。)

股票交易成本默认按双边千分之二计算,即买的时候要扣除千分之二的交易成本, 卖的时候再一次扣除千分之二的交易成本。 在调仓日,继续持有的股票仓位被调整时不扣除交易成本, 比如一只股票的仓位从50%调整为20%, 不会扣除交易成本。

股票如果停牌或者一字板涨停跌停,则不能买卖,即便是按照选股策略应该被买入或被卖出,买卖也不能进行。不能卖出的股票会被继续持有到下一个调仓日,并根据下一个调仓日的市场情况来决定是否可以买卖。

12.排名分析里收益率为什么和策略回测收益率不一样?

在排名分析里收益率挺好的策略,到策略回测里收益经常会低很多, 这是因为排名分析回测计算做了简化,没有考虑交易成本和股票停牌等问题。 比如排名分析算出的收益率可能是20%, 可到了策略回测里, 收益率变成了5% 甚至是-5% , 这往往是由交易成本造成的。 一个策略假设每天都买入卖出不同的股票, 双边的交易成本合计千分之四, 交易费一年就会吃掉100% 的收益增长。 第二点, 策略回测考虑到停牌股票不能买卖, 这一点也会造成和排名分析回测的收益不一样。

排名分析主要用于验证选股策略的相对有效性, 通过从高分段到低分段股票的收益分布趋势来判断选股策略有效性。 而使用策略回测可以得到更接近实际情况的收益曲线。

13.回测起始日变化,策略收益变化很大是什么问题?

有些策略起始日期往前或往后调整一天,策略的回测收益会变化很多。 大约有两个原因,

一是统计样本数量过少, 造成收益计算的随机性较大。 比如一个策略最大持仓股票数量是2只, 调仓周期是20天, 回测时长是5年, 按一年有240个交易日算, 回测统计数据点有 2 X 12 X 5 = 120 个。 这种策略的回测数据点少,随机性大, 收益计算的波动自然较大。 比如起始日变化一天, 回测收益就可能从80%变成30%。 建议用户增加策略回测统计的数据点至少到1000个。 增加回测数据点数量的方法有增加最大持仓股票数量,减少调仓周期的天数, 手工做起始日期的滚动回测再取平均值。

二是策略本身过度拟合, 造成结果不稳定。 这往往是策略过于复杂或者参数对于某个起始日过于调优造成的。

14.用户如何跟随自己感兴趣的策略?

在调仓日,策略结果页面会显示调仓指令。 如果策略是别人的策略,用户可以首先关注这个策略, 被关注的策略会在个人主页里出现。使用微信服务号是一种更方便的策略跟随方式,用户可以绑定果仁微信服务号, 在微信服务号里查看每个策略最新的更新情况和调仓指令。

我们建议用户根据自己的风险承受能力慎重跟随,果仁网不承担任何由于策略跟随做成的损失。

15.如果策略的选择条件产生很多只股票,策略如何选择股票买入?

使用“每日选股”,用户可以看到每一天具体有哪些股票通过筛选条件被选中。如果有排名条件,在“每日选股”的结果中还可以看到每只股票的排名得分。 一个选股策略往往能选出上百只或上千只股票,而实际上,一般用户最多能买入10到20只股票。比如用户限定一次最多买入10只股票,筛选条件产生100只股票,程序将挑出排名得分最高的10只股票买入, 如果没有指定排名条件,程序会选择成交额最大的股票买入

16.什么是市场择时?

用个股指标选个股, 用大盘指标择时,是行之有效的股票策略。 虽然我们无法准确预测未来总体市场的走势,但是根据一些常用的大盘指标, 我们可以规避一些由市场巨幅波动带来的风险。 具体使用方法,请查看市场择时

17.自定义指标是什么?

用户可以用已有的指标作为计算公式的输入定义出新的指标。 一旦创建成功, 自定义指标的使用方式和其它公共指标的使用方式一样。 具体用法,请查看自定义指标

18.策略评分规则是什么?

策略评分。 帮助用户快速的判定策略的质量。 70分以上的策略是相对较好的策略, 60分以下是相对较差的策略。 但是评分不能简单对待, 还应该仔细研究策略的成分分数。 策略评分由5个成分组成:

收益分。 根据策略的年化收益打分。 100分表明过去5年的策略年化收益大约是50%, 60分表明策略年化收益在10%-15%之间。

抗风险分。根据策略的最大回撤率和赢率计算得出。 80分以上的策略表明抗风险的能力强, 60分以下表明抗风险能力一般。

流动性分。 代表策略的容量。果仁根据保守的假设估算出策略的容量。 90分以上策略表示策略是大容量策略, 60分以下是小容量策略。

稳定性分。代表策略收益波动率的大小。 70分以上代表策略月收益波动率在5%以下。 40分以下代表策略月收益波动率在15%以上。

实盘分。策略实盘的时间越长,相对沪深300的收益越高,实盘得分就越高。用户如果修改自己的策略公式,实盘分将会清零。

为了公平起见, 评分程序不使用策略作者规定的起始日期进行回测, 还是选用几个时段对策略进行进行多次回测,各项得分从多次回测中取平均值成为为最后得分, 唯一的例外是抗风险分,使用表现最差的那次得分为最后得分。

19.果仁支持什么浏览器?

果仁建议用户使用Chrome, 其它支持的浏览器有Opera、360极速模式、Safari。还有高版本IE, 不支持IE9以下的版本。

20.为什么选股指标只有后复权价格没有前复权价格?

前复权价格包含未来信息, 为了防止用户错误使用未来信息做策略, 果仁只提供后复权收盘价作为选股指标。 但在策略结果页面,展现历史股票买入卖出价格时,果仁使用前复权价格, 这样便于用户做价格比较。

使用未来函数是量化分析最容易犯的错误之一, 为了防止这个错误的发生, 果仁网在数据准备和回测算法上做了大量工作,以确保未来函数不会被使用。

21.如何搞清楚筛选、排名、自定义指标、策略买卖的具体含义?

果仁已经提供了较为清晰的文档阐述以上功能。使用每日选股查看选股结果,是搞清这些功能的最好方法。 例如,在筛选条件里, 加入“换手率 最大 全部 10” 是得到当日全市场换手率最大的10只股票, 这个使用每日选股, 其中的含义便一目了然,如果有疑惑, 还可以更换条件为 “换手率 最小 全部 10” 或者 “换手率 最大 全部 20”, 再看结果。

另外查看策略回测结果里的调仓详情也是理解策略功能的一个重要工具。 这样做可以知晓策略具体的运作情况。 点击策略详情右上方的导出图标,可以将策略在每个周期的持仓详情导出到一个Excel文件里。


果仁选股回测快速入门

1.每日选股。可查看历史上的任何一天符合条件的股票。

图片描述


2.策略回测。 将选股策略放回真实的历史数据中,模拟交易,计算出详细收益。

图片描述


3.回测结果。对比策略收益和收益基准。查看持仓详情.

图片描述


4.可保存策略到“我的策略”里。 或者清空当前的策略。

图片描述


5.入门视频1.创建策略。

点击观看


6.入门视频2.看策略。

点击观看

7.完整视频课程。

点击查看视频课程列表


股票策略指标解释

选股指标

行情指标

技术指标

季报指标

注:果仁原始财报指标数据都以单个季度为单元, 如需要获取年内累计数据可或者年报数据,可以分别使用函数AccuQ和Annual。 函数使用详情见自定义函数列表
分类 指标名 编号 关系备注
收入 营业总收入 A1 等于 营业收入(A2)+利息收入(A3)+已赚保费+手续费及佣金收入
营业收入 A2  
利息收入 A3  
非经营性净收益 A4  仅针对非金融类公司。
非经营性净收益 = 公允价值变动净收益(A5)+投资净收益(A6)+汇兑收益+非经营性净收益特殊项目+调整项目
公允价值变动净收益 A5   
投资净收益 A6  包含 对联营合营企业的投资收益 (A7)
对联营合营企业的投资收益 A7  
营业外收入 A8  
     
支出 营业总成本 B1 对非金融类公司: 营业总成本= 营业成本(B2)+营业税金及附加+销售费用(B3)+管理费用(B4)+财务费用(B5)+资产减值损失(B6)+金融类特殊成本项目(包括利息支出(B9))。 对金融类公司: 营业总成本 = 营业成本(B2)
营业成本 B2  
销售费用 B3  
管理费用 B4  
财务费用 B5  
资产减值损失 B6  
营业外支出 B7 包含非流动资产处置净损失(B8)
非流动资产处置净损失 B8  
利息支出  B9  
所得税费用  B10  
利润 营业利润 C1 营业利润 = 营业总收入(A1)- 营业总成本(B1) + 非经营性净收益(A4) 
利润总额 C2 利润总额 = 营业利润 (C1)+营业外收入(A8) - 营业外支出(B7)+其它调整项目(多数情况为0)
净利润 C3 净利润 = 利润总额(C2) - 所得税费用 (B10) +未确认的投资损失+其它调整项目(多数情况为0)
归属于母公司所有者的净利润 C4 归属于母公司所有者的净利润 = 净利润 (C3) - 少数股东损益 - 影响母公司净利润的调整项目
现金流 经营现金流量净额 D1  
投资现金流量净额 D2  
筹资现金流量净额  D3  
现金及现金等价物净增加额 D4  
期末现金及现金等价物余额 D5 期末现金及现金等价物余额 = 现金及现金等价物净增加额(D4)+ 期初现金及现金等价物余额
固定资产折旧 D7  
无形资产摊销 D8  
长期待摊费用摊销 D9  
投资活动现金流出小计 D10  投资活动现金流出小计 = 投资活动产生的现金流量净额(D2) -投资活动现金流入小计 
资产 流动资产合计 E1 金融类公司此项为空值。
非流动资产合计 E2 金融类公司此项为空值。
资产总计 E3 对非金融类公司: 资产总计 = 流动资产合计(E1) + 非流动资产合计(E2)。 
货币资金 E4 货币资金是流动资产(E1)的一部分
存货 E5 存货属于流动资产(E1)。金融类公司此项为空值。
预付款项 E6 预付款项属于流动资产(E1)。金融类公司此项为空值。
应收账款 E7 应收账款属于流动资产(E1)。
待摊费用 E8 待摊费用属于流动资产(E1)。金融类公司此项为空值。
固定资产 E9 固定资产属于非流动资产(E2)
在建工程 E10 在建工程属于非流动资产(E2)
无形资产 E11 无形资产属于非流动资产(E2)
长期股权投资 E12 长期股权投资属于非流动资产(E2)
持有至到期投资 E13 持有至到期投资属于非流动资产(E2)
一年内到期的非流动资产 E14 一年内到期的非流动资产属于非流动资产(E2)。金融类公司此项为空值。
负债 流动负债合计 F1 金融类公司此项为空值。
非流动负债合计 F2 金融类公司此项为空值。
负债合计 F3 对非金融类公司: 负债合计 = 流动负债合计(F1) + 非流动负债合计(F2)。 
短期借款 F4 短期借款属于流动负债(F1)。
应付票据 F5 应付票据属于流动负债(F1)。金融类公司此项为空值。
应付账款 F6 应付账款属于流动负债(F1)。
预收款项 F7 预收款项属于流动负债(F1)。金融类公司此项为空值。
一年内到期的非流动负债 F8 一年内到期的非流动负债属于非流动负债(F2)。金融类公司此项为空值。
长期借款 F9 长期借款属于非流动负债(F2)
应付债券 F10  应付债券属于非流动负债(F2)
权益 归属母公司股东权益合计 H1  
所有者权益合计 H2 所有者权益合计 = 归属母公司股东权益合计(H1) + 少数股东权益 + 所有者权益调整项目(多数为0) 
资本公积 H3  
未分配利润 H4  
实收资本 H5  

财务比率

注: TTM, REFQ, AvgQ, Annual等为果仁自定函数, 具体用法请点击自定义函数列表查询
分类 名称 果仁计算公式 备注
估值 市盈率 总市值/TTM(归属于母公司所有者的净利润,0) 即PE_TTM,等于总市值除以过去12个月的归属于母公司所有者的净利润(C4)
市净率 总市值/REFQ(归属母公司股东权益合计,0) 即PB,等于总市值除以归属母公司股东权益合计(H1)。
市销率 总市值/TTM(营业总收入,0) 即PS_TTM,等于总市值除以过去12个月的营业总收入(A1)。
市现率 总市值/ TTM(经营现金流量净额,0) 即PCF_TTM,等于总市值除以过去12个月的经营现金流量净额(D1)。
EV_EBITDA (总市值+REFQ(负债合计,0)-REFQ(货币资金,0)) /(TTM(利润总额,0)+TTM(财务费用,0)+TTM(固定资产折旧,0)+TTM(无形资产摊销,0)) 等于(总市值+负债合计(F3)-货币资金(E4))除以过去12个月的(利润总额(C2)+财务费用(B5)+固定资产折旧(D7)+无形资产摊销(D8))
股息率 上一年总现金分红/总市值 等于最近一年每股现金分红除以股票价格。
清偿能力 流动比率 REFQ(流动资产合计,0) / REFQ(流动负债合计,0) 等于最近一季的流动资产合计(E1)除以流动负债合计(F1)。金融类公司此项为空值。
负债资产率 REFQ(负债合计,0) / REFQ(资产总计,0) 等于最近一季的负债合计(F3)除以资产总计(E3)。
产权比率 REFQ(负债合计,0) / REFQ(归属母公司股东权益合计,0) 等于最近一季的负债合计(F3)除以归属母公司股东权益合计(H1)。
盈利能力 营业利润率 TTM(营业利润,0) / TTM(营业收入,0) 过去12个月的营业利润(C1)除以过去12个月的营业收入(A2)
销售净利率 TTM(净利润,0) / TTM(营业收入,0) 过去12个月的净利润(C3) 除以过去12个月的营业收入(A2)
销售毛利率 (TTM(营业收入,0) - TTM(营业成本,0)) / TTM(营业收入,0) 过去12个月的(营业收入(A2)-营业成本(B2))/营业收入(A2)
资产回报率 TTM(净利润,0)/AvgQ(资产总计,4,1) 过去12个月的净利润(C3)除以一季度前过去12个月的平均资产总计(E3)
5年资产回报率 (Annual(净利润,0)+Annual(净利润,1)+Annual(净利润,2)+Annual(净利润,3)+Annual(净利润,4))/(Annual(资产总计,1)+Annual(资产总计,2)+Annual(资产总计,3)+Annual(资产总计,4)+Annual(资产总计,5))  过去5年的净利润(C3)之和除以一年前的过去5年的资产总计(E3)之和
净资产收益率 TTM(净利润,0)/AvgQ(所有者权益合计,4,1) 过去12个月的净利润(C3)除以一季度前过去12个月的平均所有者权益合计(H2)
5年净资产收益率 (Annual(净利润,0)+Annual(净利润,1)+Annual(净利润,2)+Annual(净利润,3)+Annual(净利润,4))/(Annual(所有者权益合计,1)+Annual(所有者权益合计,2)+Annual(所有者权益合计,3)+Annual(所有者权益合计,4)+Annual(所有者权益合计,5))  过去5年的净利润(C3)之和除以一年前的过去5年的所有者权益合计(H2)之和
营运效率 总资产周转率 TTM(营业收入,0)/AvgQ(资产总计,4,0) 过去12个月的营业收入(A2)除以过去12个月的平均资产总计(E3)
存货周转率 TTM(营业成本,0)/AvgQ(存货,4,0) 过去12个月的营业成本(B2)除以过去12个月的平均存货(E5)。金融类公司此项为空值。
历史增长 营业利润增长 TTM(营业利润,0)/TTM(营业利润,4) - 1 过去12个月的营业利润(C1)除以4季度前的12个月的营业利润(C1) -1。
净利润增长 TTM(净利润,0)/TTM(净利润,4) - 1 过去12个月的净利润(C3)除以4季度前的12个月的净利润(C3) -1。
利润总额增长 TTM(利润总额,0)/TTM(利润总额,4) - 1 过去12个月的利润总额(C2)除以4季度前的12个月的利润总额(C2) -1。
毛利润增长 (TTM(营业收入,0) - TTM(营业成本,0)) / (TTM(营业收入,4) - TTM(营业成本,4)) - 1 过去12个月的毛利润除以4季度前的12个月的毛利润-1。毛利润等于营业收入(A2)减去营业成本(B2)
营业收入增长 TTM(营业收入,0) / TTM(营业收入,4) - 1 过去12个月的营业收入(A2)除以4季度前的12个月的营业收入(A2)-1。
净资产增长 REFQ(所有者权益合计,0) / REFQ(所有者权益合计,4)) - 1 最近一季的所有者权益合计(H2)除以4季度前的所有者权益合计(H2) -1 
总资产增长 REFQ(资产总计,0) / REFQ(资产总计,4) - 1
最近一季的资产总计(E3)除以4季度前的资产总计(E3) -1 
每股指标 每股收益 TTM(归属于母公司所有者的净利润,0)/总股本 过去12个月归属母公司所有者的净利润(C4)除以总股本
每股净资产 归属母公司股东权益合计/总股本 最近一季的归属母公司股东权益合计(H1)除以总股本
每股营业利润 TTM(营业利润,0)/总股本 过去12个月营业利润(C1)除以总股本
每股营业收入 TTM(营业收入,0)/总股本 过去12个月营业收入(A2)除以总股本
每股经营性现金流 TTM(经营现金流量净额)/总股本 过去12个月经营现金流量净额/总股本
每股现金流量净额 TTM(现金及现金等价物净增加额)/总股本 过去12个月现金及现金等价物净增加额(D1)除以总股本
每股资本公积金 资本公积/总股本 最近一季的资本公积(H3)除以总股本
每股未分配利润 未分配利润/总股本 最近一季的未分配利润(H4)除以总股本

公司事件

情绪指标

策略指标解释


如何使用排名和筛选

排名和筛选的区别

股票筛选在各个股票网站和软件上都有提供,大家都很熟悉。使用筛选,用户可以迅速挑出满足筛选条件的股票剔除不满足筛选条件股票。 股票排名是一种更有效的更被专业投资者青睐的选股方法,也是果仁网推荐的选股方法。 大家在过去一直没有机会接触排名选股的方法,会感到比较陌生,其实它的原理非常简单。在学校里, 一个班的学生按各科成绩的综合起来进行排名,排在前面的学生会得奖学金。 类似的方法,用户可以对市场上的股票按几项指标进行综合排名,并买入排名靠前的股票。和筛选相比,排名可以实现更精细更稳定的选股策略,原因如下:

当用户同时定义筛选条件和排名条件时,果仁会首先按照筛选条件筛选股票,再按照排名条件对股票排名。 在实际选股中,大家可首先使用筛选来粗选出一大批股票,再用排名精选出少量的股票作为投资对象。

排名分计算规则

排名虽然一直是专业人士的投资方法,但原理非常简单,只要有初级算术的知识就能理解排名分的计算规则。

下面我们用一些实例来介绍果仁排名分的具体计算规则。 比如一共有5只股票A,B,C,D,E参加排名。它们的收盘价分别是10,12,20,30,40。 按收盘价从小到大排名, A,B,C,D,E的排名就是1, 2, 3, 4, 5。果仁根据排名先后算出排名分,排名分的公式是 (股票数– 股票排名 + 1)/股票数 * 100。按照这个公式, 排名第1得100, 排名第二得80,依次类推,排名第5得20。 详细情况如下表列出:

股票 收盘价 从小到大排名 从小到大排名分 从大到小排名 从大到小排名分
A 10 1 100 5 20
B 12 2 80 4 40
C 20 3 60 3 60
D 30 4 40 2 80
E 40 5 20 1 100

当某只股票的指标为空时,这只股票将一直排在最后,排名分最低。比如A,B,C,D,E的市盈率分别为10, 20, 30, 空,空(当一个公司亏钱时,市盈率无法算出,则市盈率为空。), 排名分的计算详细在下表列出:

股票 市盈率 从小到大排名 从小到大排名分 从大到小排名 从大到小排名分
A 10 1 100 3 60
B 20 2 80 2 80
C 30 3 60 1 100
D 4 40 4 40
E 4 40 4 40

当有两个以上的指标作为排名条件时, 用户可以给每个指标设定权重(默认值为1),综合排名分 = 排名分1 × 权重1 + 排名分2 × 权重2 + ...

为了方便展示, 我们对综合排名分再做一次排名,算出排名总分。

比如,我们用如下排名条件对股票A,B,C,D,E进行排名

收盘价,从小到大,权重 1

市盈率,从大到小,权重 1

股票 收盘价 收盘价排名分 市盈率 市盈率排名分 综合排名分 总排名分
A 10 100 10 60 160 100
B 12 80 20 80 160 100
C 20 60 30 100 160 100
D 30 40 40 80 40
E 40 20 40 60 20

空值处理

一个指标经常有空值,比如5年净资产收益率很多股票没有数值。无论是从大到小排,还是从小到大排,空值一直排在最后, 也就是指标为空的股票排名分最低, 值为空的股票都排在最后。


如何做排名分析

用户可使用排名分析判断排名策略是否有效。回测程序将所有股票按照排名总分分成5段,10段或更多段,计算每段里的股票总收益,输出一个年化收益柱状图和一个累计收益曲线,以便让用户检查是否排名越高的分段收益越好。

比如我们可将所有股票按排名条件分成5段,从低到高依次为0-20,20-40,40-60,60-80,80-100。 如果年化收益图(如下图所示)高低排列整齐,则表示此排名策略可能含有较强的投资意义,排名高的股票更有可能产生超额收益。专业对冲投资者也非常喜欢此类形状的图形,他们可以买入最高分段股票,卖空最低分段股票,以获得相对收益。 图中 0-20分段代表综合排名分在0-20之间的股票,0-20这个分段里的股票是排名分最低的股票,也就是排在最后的股票。80-100分段代表综合排名分在80-100之间的股票,80-100这个分段里的股票是排名分最高的股票,也就是排在最前面的股票。用户可以在每日选股里查看到每个股票的综合排名分。

整齐的高低排列代表较好的排名策略

图 1 整齐的高低排列代表较好的排名策略

与年化收益相应的累计收益曲线图展示各分段的股票收益在时间轴上的变化,用户可以获取更加详细收益变化的信息。

整齐的高低排列代表较好的排名策略

图 2 累计收益曲线展示更加详细的收益变化

反过来,如果在年化收益图中(如下图)各分段收益高低错落,则代表此排名策略的投资意义不强,即便排名策略在策略回测中收到较好的收益,也需要谨慎的使用这个排名策略。

整齐的高低排列代表较好的排名策略

图 3 高低不齐图形往往代表排名策略投资意义不强

如果排名指标里含有空值(NULL),那么无论从小到大排还是从大到小排空值一直排在最后。所以从大到小排名的80-100分段和从小到大排名的0-20分段收益不一定一样。 如果将指标中的空值筛掉, 从大到小的80-100分段和从小到大的0-20分段的收益将会一样或者非常近似。 数据空值代表数据库里就没有这样的数据, 比如有很多股票的预期盈利增长是空值,表明很多股票没有5年净资产收益率的数据。用户可以通过将指标放入到筛选条件来排除指标里的空值,只要指标在筛选条件使用, 指标的空值就会被筛掉。比如筛掉市盈率中的空值, 可用筛选条件市盈率 >0。


自定义指标

以公共指标为原材料,用户可以自己定义更多的指标。比如:

5日20日均价差值 = 5日平均复权价 – 20日平均复权价

1日5日量比 = 当日成交量 / 5日平均成交量

5日前收盘价 = ref(收盘价, 5)

目前自定义指标支持的计算表达式有:
一、 算数四则运算。比如 “(收盘价 + 开盘价)/2”或者  “1日5日量比 = 当日成交量 / 5日平均成交量”

二、日期前移函数。这是一个非常重要的函数。 

Ref(指标, 天数) , 取得指标几个交易日前的值。当天数为0时, 返回数据起始第一天的指标数据。  例子“Ref(收盘价,5)” 就是5个交易日前收盘价。“Ref(收盘价,0)”返回上市第一天收盘价, 2007年以前上市的股票返回2007-01-04的收盘价。该函数支持变量天数的计算,例子:“Ref(收盘价,countbars(收盘价>0,9999)-5)”返回股票上市后第5天的收盘价。

 

 BarRef(指标, 天数) , 取得指标几根日K线前的值.  Ref()功能类似, 很多情况返回同样的值. 区别是Ref()包括停牌日, BarRef()跳过停牌日, 只数几根K线。 比如“barRef(收盘价,5)” 就是5K线前的收盘价。该函数支持变量天数的计算,例子:“BarRef(收盘价,countbars(收盘价>0,9999)-5)”返回股票上市后第5根K线 的收盘价。


三、时序统计函数(纵向统计函数)。 以下函数是对每一只股票的指标在连续的一段日期里进行聚合运算:
 
 MA(指标,天数)计算指标在过去几个交易日(不包含停牌日)的平均值; 天数为0时,从数据起始日开始计算指标的移动平均。比如 “MA(收盘价,5)”就是过去5日平均收盘价; MA(收盘价,0)”从上市第一天算起的平均收盘价,2007年以前上市的股票从2007-01-04算起平均收盘价。该函数支持变量天数的计算,例子:“MA(收盘价,barslast(Crossover(5日复权均价, 20日复权均价)))”返回股票自上次均线金叉以来的平均收盘价

 

 EMA(指标,天数) 计算指标在过去几个交易日(不包含停牌日)的指数平均值;  比如 “EMA(收盘价,5)”就是过去5日指数平均收盘价。该函数的天数参数必须是常数,不可以是变量。


 SMA(指标,天数,权重) 计算指标在过去几个交易日(不包含停牌日)的平滑移动平均值。EMA(指标,天数)相当于SMA(指标,天数,2)  比如 “SMA(收盘价,5, 1.5)”就是以1.5为权重的过去5日平滑移动平均收盘价。该函数的天数参数必须是常数,不可以是变量。

  

 WMA(指标,权重指标, 天数) 计算指标在过去几个交易日(不包含停牌日)的加权平均值;  天数为0时,从数据起始日开始计算加权移动平均。 比如 “WMA(收盘价,成交量, 5)”就是过去5日成交量加权平均收盘价, 它比过去5日简单均线更能反映股票的成本线。“WMA(收盘价,成交量, 0)”从上市第一天算起的加权平均收盘价 (2007年以前上市的股票从2007-01-04算起的加权平均收盘价)。该函数支持变量天数的计算,例子:“WMA(收盘价,成交量,barslast(Crossover(5日复权均价, 20日复权均价)))”返回股票自上次均线金叉以来的 成交量加权平均收盘价。  

 

 Med(指标,天数)计算指标在过去几个交易日(不包含停牌日)的中值;比如“Med(市净率,30)”返回过去30个交易日的市净率中值。该函数的天数参数必须是常数,不可以是变量。

 

 Sum(指标, 天数) 计算指标在过去几个交易日(不包含停牌日)的聚合值;天数为0时,从数据起始日开始计算聚合值。比如 “Sum(当日成交量,10)”就是过去10日总成交量。该函数支持变量天数的计算,例子:“Sum(当日成交量barslast(Crossover(5日复权均价, 20日复权均价)))”返回股票自上次均线金叉以来的成交量之和

 

 Max(指标,天数) 计算指标在过去几个交易日(不包含停牌日)的最大值; 天数为0时,从数据起始日开始计算。最大值。“Max(收盘价, 10)”就是过去10日最高收盘价。该函数支持变量天数的计算,例子:“Max(收盘价,barslast(Crossover(5日复权均价, 20日复权均价)))返回股票自上次均线金叉以来的 最高收盘价。

 

 Min(指标, 天数 计算指标过去几个交易日(不包含停牌日)的最小值;  天数为0时,从数据起始日开始计算最小值。“Min(收盘价, 10)”就是过去10日最低收盘价;“Min(收盘价, 0)”上市以来最低收盘价(2007年以前上市的股票从2007-01-04算起的最低收盘价)。该函数支持变量天数的计算,例子:“Min(收盘价,barslast(Crossover(5日复权均价, 20日复权均价)))返回股票自上次均线金叉以来 的最低收盘价。

 

 Stdev(指标,天数)* 计算过去几个交易日(不包含停牌日)的标准方差;  天数为0时,整个数据历史上的标准方差。 比如股价在过去20日涨幅波动率 = Stdev(1日涨幅, 20)”; 全部历史的涨幅波动率 = Stdev(1日涨幅, 0)”。该函数支持变量天数的计算,例子:“Stdev(1日涨幅,barslast(Crossover(5日复权均价, 20日复权均价)))返回股票自上次均线金叉以来 1日涨幅波动率。

 

 Var(指标, 天数)* 计算指标在过去N个交易日(不包含停牌日)的方差;  天数为0时,整个数据历史上的方差。例子:var(收盘价,250)返回收盘价在过去250天的方差;var(收盘价,0)返回收盘价在过去全部历史的方差。该函数支持变量天数的计算,例子:“Var(1日涨幅,barslast(Crossover(5日复权均价, 20日复权均价)))返回股票自上次均线金叉以来的 1日涨幅方差。


以上的窗口函数,都会跳过停牌日期, 比如 ”Max(收盘价, 10)" 里面的10天不包含个股停牌的日期,  如果想算入停牌日期, 可以使用MA2,EMA2,Med2, Sum2, Max2, Min2, Stdev2, Var2。

 Corr(指标1,指标2,天数)计算在过去几个交易日里两个指标的相关性;  天数为0时,返回两个指标整个数据历史上的相关度。例子: "corr(1日涨幅, #bench.change.000001, 20)"返回个股1日涨幅和上证指数1日涨幅在过去20日的相关度;  "corr(1日涨幅, #bench.change.000001, 0)"返回个股1日涨幅和上证指数1日涨幅在历史上的相关度 。该函数支持变量天数的计算,例子:“Corr(1日涨幅,#bench.change.000001,countbars(收盘价>0,9999)-5)”返回股票上市后第5天到目前为止股票与上证指数1日涨幅的相关度。Corr() 的计算不会跳过停牌日。 Corr() 的计算不会跳过停牌日。

 Covar(指标1, 指标2, 天数N)计算两个指标在过去几个交易日里的协方差;  天数为0时,返回两个指标整个数据历史上的协方差。例子:“covar(1日涨幅, 收盘价, 250)” 返回1日涨幅和收盘价在过去250天的协方差;covar(1日涨幅, 收盘价, 0)” 返回1日涨幅和收盘价在过去历史上的协方差。该函数支持变量天数的计算,例子:“Covar(1日涨幅,收盘价,countbars(收盘价>0,9999)-5)”返回股票上市后第5天到目前为止股票1日涨幅与收盘价的协方差。 Covar() 的计算不会跳过停牌日。

四、时序回归函数(纵向回归函数)。最小二乘法线性回归函数。以下函数是对每一只股票的指标在连续的一段日期里进行聚合运算:

Forcast(指标,天数), 计算指标在过去N个交易日(不包含停牌日)的线性回归预测值; 天数为0时,计算指标在整个数据历史上的线性回归预测值。
例子: Forcast(收盘价,20)用当天和过去19天一共20天的收盘价作线性回归,返回收盘价的预测值;Forcast(收盘价,0)用过去全部历史收盘价作线性回归,返回收盘价的预测值。 该函数的天数参数必须是常数,不可以是变量。 

Slope(指标,天数), 计算指标在过去N个交易日(不包含停牌日)的线性回归斜率; 天数为0时,计算指标在整个数据历史上的线性回归斜率。例子: Slope(收盘价, 20)  用当天和过去19天一共20天的收盘价作线性回归, 返回过去20日的收盘价线性斜率; Slope(收盘价, 0) 返回过去全部历史的收盘价线性回归斜率 。该函数的天数参数必须是常数,不可以是变量。

Neutralize(指标Y,指标X,天数), 返回指标Y剔除指标X因素后的值。根据过去N个交易日(不包含停牌日)指标Y和指标X的线性回归模型, 将指标X的成分从指标Y中剔除, 中性化指标Y。天数为0时,根据过去整个数据历史的线性回归模型,清洗指标Y
例子: Neutralize(当日成交额,总市值,20) 根据过去20日的线性回归模型,清洗当日成交额指标,返回剔出总市值成分后的当日成交额; Neutralize(当日成交额,总市值,0)根据过去全部历史的线性回归模型,清洗当日成交额指标指标,返回剔出总市值成分后的当日成交额。该函数的天数参数必须是常数,不可以是变量。

SlopeXY(指标Y,指标X,天数), 返回指标Y和指标X过去N个交易日(不包含停牌日)的线性回归斜率; 天数为0时,返回过去整个数据历史上的线性回归斜率。例子: Slopexy(当日成交额,总市值,20)返回过去20日成交额与总市值的线性回归斜率 ; Slopexy(当日成交额,总市值,0) 返回过去全部历史成交额与总市值的线性回归斜率 ”。该函数的天数参数必须是常数,不可以是变量。

InterceptXY(指标Y,指标X,天数), 返回指标Y和指标X过去N个交易日(不包含停牌日)的线性回归的Y轴截距; 天数为0时,返回过去整个数据历史上的线性回归Y轴截距。例子: InterceptXY(当日成交额,总市值,20) 过去20日成交额与总市值的线性回归Y轴截距; InterceptXY(当日成交额,总市值,0) 返回过去全部历史成交额与总市值的线性回归Y轴截距。   该函数的天数参数必须是常数,不可以是变量。


五、股票统计函数(横向统计函数) 在当天内对所有股票的某个指标进行统计。
 HMax(指标,范围) 范围 = 0时, 返回全部A股指标的当天最大值, 范围等于1时, 返回股票同行业内的股票指标的当天最大值。 比如 "HMax(收盘价, 1) "返回股票同行业内的股票当天最高收盘价。

 HMin(指标,范围) 范围 = 0时, 返回全部A股指标的当天最小值, 范围等于1时, 返回同行业内的股票指标的当天最小值。 比如 "HMax(收盘价, 1) "返回股票同行业内的股票当天最低收盘价。

 HAvg(指标,范围 ) 范围 = 0时, 返回全部A股指标的当天平均值, 范围等于1时, 返回同行业内的股票指标的当天平均值。 比如 "HMax(市净率, 1) "返回股票同行业内的股票当天平均市净率

 HWAvg(指标,权重指标,范围 ) 范围 = 0时, 返回全部A股指标的当天加权平均值, 范围等于1时, 返回同行业内的股票指标的当天加权平均值。 比如 "HWAvg(1日涨幅, 总市值, 1)" 返回股票所在行业的当天按市值加权平均涨幅。

 HMed(指标,范围) 范围 = 0时, 返回全部A股指标的当日中位数, 范围等于1时, 返回同行业内的股票指标的当日中位数。 比如 "HMed(净资产增长, 1)" 返回股票所在行业里的净资产增长率的中值。

 HSum(指标,范围) 范围 = 0时, 返回全部A股指标的当日和值, 范围等于1时, 返回同行业内的股票指标的当日和值。比如 "HSum(流通市值, 1)" 返回股票所在行业的总流通市值。

 HStdev(指标,范围) 范围 = 0时, 返回全部A股指标的当日标准方差, 范围等于1, 返回同行业内的股票指标的当日标准方差。 "HStdev(20日涨幅,1)" 返回股票所在行业里的股票20日涨幅的标准方差, 代表了行业内股票近期涨幅的离散度。

 HCorr(指标1,指标2,范围) 范围 = 0时, 返回全部A股的两个指标的当日相关度。范围等于1, 返回同行业内的股票两个指标的当日相关度。  比如HCorr(20日涨幅, 市净率, 0) 就是全部A股的20涨幅和市净率的相关度。

 CountStock(条件, 范围) 返回当天符合条件的股票数。范围 = 0, 在全部A股中计数, 范围等于1, 在同行业内部计数。
 "CountStock(1日涨幅 > 0.05, 0)"  全股票中当日涨幅大于5% 的股票个数
 "CountStock(1日涨幅 > 0.05, 1)" 同行业中 当日涨幅大于5% 的股票个数
 "CountStock(后复权收盘价>20日复权均价, 0) /CountStock(收盘价>0, 0)" 站在20日均线之上的股票占全部股票的比例。

 HRank(指标,顺序标记,范围) 将股票按当天的指标值排名, 并返回排名名次。顺序标记= 0时 , 是由小到大排名,顺序标记= 1时, 是由大到小排名。 范围 = 0时, 对全部A股排名, 范围 = 1时,对同行业内的股票排名。例子: HRank(收盘价, 0, 0), 将所有A股按照收盘价由小到大排名,并返回每个股票的名次。 收盘价最低的股票HRank是1, 第二低的HRank是2, 依次类推。 HRank(收盘价, 0, 1),将所有股票在各自的行业内按收盘价由小到大排名,每个行业有自己的第一名, HRank是1 的股票有20多个。

HRankScore(指标,顺序标记, 范围)将股票按当天的指标值排名, 并返回排名分。排名分在0到100之间,排在最前面的股票得分100。排名分的具体计算规则在帮助文档中。顺序标记= 0时 , 是由小到大排名,顺序标记= 1时, 是由大到小排名。 范围 = 0时, 对全部A股排名, 范围 = 1时, 对同行业内股票排名。例子: HRankScore(收盘价, 0, 0), 将所有A股按照收盘价由小到大排名,并返回每个股票的排名分。 收盘价最低的股票HRankScore是100, 第二低的HRank是99.9, 依次类推。

HPercentile(指标,分位数, 0)  返回指标的分位值。范围 = 0时, 返回全部A股中的分位值。范围等于1, 返回同行业内的分位值。  例子:“hPercentile(收盘价,0.9, 0)” 是A股收盘价的90%分位值,也就是收盘价最高10%的值。

HWinsorize(指标,上限分位,下限分位,范围),  使用简单分位数去极值。范围 = 0时, 返回全部A股的指标的去极值化的值。范围等于1, 返回同行业内的指标的去极值化的值。例子:“hWinsorize(收盘价, 0.01, 0.05, 0)“ 在全部A股中,将收盘价最高的1%的股票的收盘价设为99%分位的收盘价,将收盘价最低的5%的股票的收盘价设为5%分位的收盘价。

HStandarize(指标,范围), 范围 = 0时, 返回全部A股的指标的标准化值。范围等于1, 返回同行业内的指标的标准化值。例子:“hStandarize(市盈率, 0)“ 就是全部A股市盈率的标准化值。 对于熟悉统计学的用户, 标准化值就是Z分数。 
 注意 :
1 当股票指标的值为空时, 这只股票不参与统计。 比如"HAvg(市盈率, 0)" 计算全市场股票平均市盈率, 市盈率为空值的股票不参与统计。
2 股票投资域或筛选条件的设定不影响横向统计函数的结果。 
3 以上函数也适用于基金策略。 在基金策略中, 范围 = 0,代表全部的基金和指数, 范围= 1,代表在同一投资种类计数。



六、股票池统计函数
在当天内对一个股票池或基金池内的所有股票的某个指标进行统计。 
SMax(指标,股票池股票池内的所有股票的某一指标在当天的最大值。 ”SMax( 收盘价, 低价股)“ 返回股票池“低价股”中的股票在当天的最高收盘价。

SMin(指标,股票池 股票池内的所有股票的某一指标在当天的最小值。 ”SMin( 收盘价,低价股)“ 返回股票池“低价股”中的股票在当天的最低收盘价。
 
SAvg(指标,股票池股票池内的所有股票的某一指标在当天的平均值。 ”SAvg( 市净率,低价股)“ 返回股票池“低价股”中的中股票在当天的平均市净率。

SWAvg(指标,加权指标,股票池) 股票池内的所有股票的某一指标在当天的加权平均值。 ”SWAvg( 市净率, 总市值,低价股)“ 返回股票池“低价股”中的股票在当天的按总市值加权的平均市净率。

SMed(指标,股票池 股票池内的所有股票的某一指标在当天的中位数。 “SMed(净资产增长,低价股 )”返回股票池“低价股”中的股票的净资产增长率的中值。

SSum(指标,股票池 股票池内的所有股票的某一指标在当天的和。 ”SSum( 流通市值,低价股)“ 返回股票池“低价股”中的股票在当天的流通市值之和。

SStdev(指标, 股票池股票池内的所有股票的某一指标在当天的标准方差。 ”SStdev( 20日涨幅,低价股)“ 返回股票池“低价股”中的股票20日涨幅的标准方差。

SCorr(指标1, 指标2,股票池)  股票池内的所有股票的某一指标在当天的相关度。 ”SCorr(20日涨幅, 市净率,低价股)“ 返回股票池“低价股”中的股票20日涨幅和市净率的相关度。

SCount( 条件,股票池 返回在股票池里符合条件的股票数。 "SCount(1日涨幅 > 0.05,低价股 )"  股票池“低价股”中的当日涨幅大于5% 的股票数。

SRank (指标,顺序标记,股票池) 将股票池中的股票按当天的指标值排名, 并返回排名名次。顺序标记= 0时 , 是由小到大排名,顺序标记= 1时, 是由大到小排名。 例子:” SRank(收盘价, 0, 低价股)“, 将股票池“低价股”中的股票按照收盘价由小到大排名,并返回每个股票的名次。 收盘价最低的股票SRank是1, 第二低的SRank是2, 依次类推。

SRankScore(指标,顺序标记, 股票池)将股票池中的股票按当天的指标值排名, 并返回排名分。排名分在0到100之间,排在最前面的股票得分100。排名分的具体计算规则在帮助文档中。顺序标记= 0时 , 是由小到大排名,顺序标记= 1时, 是由大到小排名。 例子: SRankScore(收盘价, 0, 低价股 ), 将股票池“低价股”中的股票按照收盘价由小到大排名,并返回每个股票的排名分。 假设股票池中有100只股票,收盘价最低的股票SRankScore是100, 第二低的SRankScore是99, 依次类推。


Svalue(起始日期,股票池) 返回股票池从起始日期开始计算的净值, 起始日期和起始日期之前的净值设置为1。净值计算假设股票池中的股票等权重。
例子: Svalue(2010/01/04,低价股), 返回股票池“低价股”以2010/01/04为起始日的净值。


注意:
1.股票池的参数必须是用户自己定义的股票池,在基金策略中, 股票池参数是用户自己定义的基金池。  
2.用股票池函数的指标不能在动态股票池的定义中使用。
3 以上函数也适用于基金策略。 在基金策略中, 股票池参数就是基金池。 

七、数学函数。
 abs(指标) 返回指标的绝对值
 log(指标, 常数 = 10)   返回指标的对数值。“ log(收盘价)”收盘价取10的对数值, “log(收盘价, 2)”收盘价取2的对数值。 如指标是负值, 返回空。 
 sqrt(指标)  返回指标的平方根。 指标是负值, 返回空。
 Round(指标)  将指标四舍五入返回整数。"Round(1.6)" =2, "Round(收盘价)" 将收盘价的值四舍五入取整数。
 Mod(指标1, 指标2或者常数) 用指标1整除指标2,返回整除的余数。 "Mod(12, 10)"  = 2, "Mod(收盘价, 10)"将收盘价整除10再取余数。
 Floor(指标)  沿指标绝对值减小的方向取整数。 比如"Floor(1.6)" = 1, "Floor(收盘价)"将收盘价往下取整。
 Power(指标,乘幂指数) 计算指标的乘幂。比如"power(收盘价, 2)" 得到收盘价的平方, “power(收盘价, 0.5)”得到收盘价的平方根。

八、逻辑函数 
And(条件1, 条件2) 。 两个输入条件都是真(非0),返回1, 否则返回0。
输入条件是关系表达式或者是数值指标, 比如 ‘指标 > 123 ‘
And(1, 1)返回1, And(1,0) 返回0 , And(1, 空)返回0
例子:
有成交量低价格 = “ And(当日成交量> 0, 收盘价 < 5)” , 当日成交量大于0而且收盘价小于5时,返回1, 否则返回0。

Or(条件1, 条件2) 。 两个输入有一个是真值(非0数值),返回1, 否则返回0。输入条件是关系表达式或者是数值指标。
Or(0, 1)返回1,, Or(0,0) 返回0 , Or(1, 空)返回 1
例子:
有成交量或者低价格 = “ Or(当日成交量> 0, 收盘价 < 5)”当日成交量大于0或者收盘价小于5时,返回1, 否则返回0。

Not(条件)。输入是一个是真值(非0数值),返回0, 否则返回1。输入条件是关系表达式或者是数值指标。
Not(1) = 0 , Not (0) = 1, Not (空) = 空
例子
没有成交量 = “Not(当日成交量 > 0)”  当日成交量大于0时返回0,否则返回1。


九、合并函数
If(条件, 指标1, 指标2)。 当条件为真(1)的时候, 返回指标1, 否则返回指标2。例子:“if(5日复权均价 > 20日复权均价, 1, 0)”如果5日均价高于20日均价 返回1 ,否则返回0。

Greater(指标1, 指标2) 返回指标1和指标2之间较大的那个值, 等价于“if(指标1 >指标2, 指标1 ,指标2)” 。 比如"Greater(2, 1)" = 2, "Greater(收盘价, 开盘价)“返回收盘价和开盘价较大的那个值。 

 Less(指标1, 指标2) 返回指标1和指标2之间较小的那个值, 等价于“if(指标1 <指标2, 指标1 ,指标2)” 。 比如”Less(2, 1)“ = 1, ”Less(收盘价, 开盘价)“返回收盘价和开盘价较小的那个值。


十、金叉死叉函数。
 crossover (短线指标, 长线指标) 金叉函数, 如果短线指标上穿长线指标, 返回1, 否则返回0. 比如" crossover (5日复权均价, 60日复权均价) " 当5日线上穿60线时, 返回 1 ; 否则返回0。
 crossunder(短线指标, 长线指标) 死叉函数, 如果短线指标下穿长线指标, 返回1, 否则返回0. 比如" crossunder (5日复权均价, 60日复权均价) " 当5日线下穿60线时, 返回 1 ; 否则返回0。

十一、日期统计函数 
  CountDays(条件,天数N), 统计在过去N个交易日里(包含股票停牌日), 条件值为真 的天数。 例子

  过去10天里涨停的天数 = CountDays(当日涨停标记 = 1, 10) 
 
过于30天里停牌的天数 = CountDays(成交量 = 030) 
 
过于30天里出现金叉的天数 = CountDays(Crossover(5日复权均价, 20日复权均价), 30)

该函数支持变量天数的计算,例子:

上次发生金叉后股价上涨天数 = “CountDays(1日涨幅>0, barslast(Crossover(5日复权均价, 20日复权均价 )))”

 

CountBars(条件,天数N) ,统计在过去N个交易日里(不包含股票停牌日), 条件值为真 的天数。例子:

过去10天里涨停的天数 = CountBars(当日涨停标记 = 1, 10)”。

该函数支持变量天数的计算,例子:

上次发生金叉后股价上涨天数 = CountBars(1日涨幅>0, barslast(Crossover(5日复权均价, 20日复权均价)))

CountBars CountDays区别是CountDays()包括停牌日, CountBars()跳过停牌日, 只数几根K线。


 DaysLast(条件), 统计条件为真最后一天到现在的交易日数量(包含股票停牌日)。 例子 :
 连续上涨天数 = “DaysLast (1日涨幅<= 0) ” 就是现在到上次不上涨的那一天的天数。
 连续交易的天数= “DaysLast (当日成交量 = 0)” 也就是上一次停牌到现在的天数。
 连续涨停的天数 = “DaysLast (当日涨停标记 = 0)” 也就是距离上次没有涨停的天数。

 BarsLast(条件),统计条件为真最后一天到现在的交易日数量(不包股票含停牌日)。 例子:
 连续涨停的天数 = BarsLast (当日涨停标记 = 0) , 也就是距离上次没有涨停的天数。
 BarsLast()与DaysLast区别是DaysLast()包括停牌日, BarsLast()跳过停牌日, 只数几根K线。


十二、条件取值函数 
 LastValue(指标, 条件) 。 返回最后一次满足条件那一天的指标值。 例子: LastValue (收盘价, 1日涨幅 > 0.05) 返回最后一次涨幅大于5%的收盘价。

十三、指标数据函数
TickerValue(指标,股票代码) , 返回股票代码对应的指标值。 例子: "收盘价 - tickerValue(收盘价, ‘000002’)"  ,  返回本股票收盘价和万科A收盘价的差价。 如果代码不合法, 可以返回空值。  

IsNULL(指标), 如果指标为空值, 返回1, 否则返回0 。 例子 "isNULL(市盈率)" , 如果股票的市盈率是空值, 返回1, 否则返回0。

IfNULL(指标1, 指标2) , 如果指标1为空值, 返回指标2, 否则返回指标1。 指标2可以是常数或表达式。 例子:"isNULL(市盈率,0)" , 如果股票的市盈率是空值, 返回0, 否则返回市盈率。


十四、反身函数
 ticker(),  返回股票本身的股票代码。 ticker()需要和if()结合使用, 可以对某只或某几只股票作特殊处理。 例子:
“if(ticker() = ‘000002', 1, 0)” 如果当前股票是万科A返回1,其它股票返回0。
 调整乖离率 = “if(ticker() = ‘000002', 后复权收盘价/MA(后复权收盘价,30)- 1, 后复权收盘价/MA(后复权收盘价,40)- 1)”, 对万科使用30日乖离率, 对其它股票使用40日乖离率。 
 在基金策略中, ticker()返回基金自身的基金代码, 用法和在股票策略中一样。 

 industry(), 返回股票所在行业的代码,仅在股票策略中有效。行业代码在下表中列出。 industry() 需要和if表达式结合使用, 可以对某个行业的股票或某几个行业的股票做出特殊处理。 
 例子: 股票估值低= "if(industry() = 25, 市盈率 < 10, 市盈率 < 30)", 如果当前股票属于银行业,市盈率小于10就返回真(1), 如果当前股票不属于银行业,市盈率小于30就返回真(1)。
 行业代码列表:
 行业代码 行业
 0 交通运输
 1 休闲服务
 2 传媒
 3 公用事业
 4 农林牧渔 
 5 化工
 6 医药生物
 7 商业贸易
 8 国防军工
 9 家用电器
 10 建筑材料
 11 建筑装饰
 12 房地产
 13 有色金属
 14 机械设备
 15 汽车
 16 电子
 17 电气设备
 18 纺织服装
 19 综合
 20 计算机
 21 轻工制造
 22 通信
 23 采掘
 24 钢铁
 25 银行
 26 非银金融
 27 食品饮料 


十五、大盘指标变量 
 #Bench.Close.指数代码 返回某个指数的收盘价。 比如”#Bench.Close.000001“ 是上证指数的收盘价, 而”#Bench.Close.000300“ 是沪深300的收盘价。  
 #bench.open.指数代码 返回某个指数的当日开盘价。比如”#Bench.open.000001“ 是上证指数的当日开盘价, 而”#Bench. open.000300“ 是收盘指数的当日开盘价。
 #bench.high.指数代码 返回某个指数的当日最高价。比如”#Bench.high.000001“ 是上证指数的当日最高价, 而”#Bench. high.000300“ 是收盘指数的当日最高价。
 #bench.low.指数代码 返回某个指数的当日最低价。比如”#Bench.low.000001“ 是上证指数的当日最低价, 而”#Bench. low.000300“ 是收盘指数的当日最低价。
 #Bench.Change.指数代码 返回某个指数的日涨幅。 比如”#Bench.Change.000001“ 是上证指数的日涨幅, 而”#Bench.Change.399006“ 是创业板的日涨幅。
 #Bench.Vol.指数代码 返回某个指数的成交量。比如”#Bench.Vol.000001“ 是上证指数的成交量, 而”#Bench.Vol.399006“ 是创业板的成交量。
 #Bench.Amt.指数代码 返回某个指数的成交额。比如”#Bench.Amt.000001“ 是上证指数的成交额, 而”#Bench.Amt.399006“ 是创业板的成交额。
 #bench.PE.指数代码, 返回某个指数的加权市盈率。 加权市盈率 = 指数成分股的总市值 / 指数成分股的总利润TTM。比如 "#Bench.PE.000001"是上证指数成分股的加权平均市盈率, 而”#Bench.PE.000300“ 是沪深300成分股的加权平均市盈率。  
 #bench.PE2.指数代码,返回某个指数的调和市盈率。调和市盈率 = 指数成分股PE倒数的均值的倒数,即 1 / Avg(成份股E/P). 这样算出来的PE近似于指数PE中值,且更加合理。 比如 "#Bench.PE2.000001"是上证指数成分股的调和平均市盈率,  而”#Bench.PE2.000300“ 是沪深300成分股的调和平均市盈率。  
 #bench.PB.指数代码, 返回某个指数的加权市净率。 加权市净率= 指数成分股的总市值 / 指数成分股的总净值.  比如 "#Bench.PB.000001"是上证指数成分股的加权平均市净率, 而”#Bench.PB.000300“ 是沪深300成分股的加权平均市净率。  
 #bench.PB2.指数代码,返回某个指数的调和市净率。指数成分股PB倒数的均值的倒数,即 1 / Avg(成份股B/P)。这样算出来的PB是比较合理的指数PB中值。 比如 "#Bench.PB2.000001"是上证指数成分股的调和平均市净率,  而”#Bench.PB2.000300“ 是沪深300成分股的调和平均市净率。
 #bench.zt.指数代码,指数成分股的涨停比例,比如“#bench.zt.000001”是上证指数成分股涨停比例。 
 #bench.dt.指数代码,指数成分股的跌停比例,比如“#bench.dt.000001“是上证指数成分股跌停比例。
 #bench.up.指数代码,指数成分股的上涨比例,比如“#bench.up.000001”是上证指数成分股上涨比例。
 #bench.down.指数代码,指数成分股的下跌比例,比如“#bench.down.000001”是上证指数成分股下跌比例。

大盘指标变量可以用于个股指标和大盘之间的比较。 几个自定义指标使用大盘指标的例子: 
个股相对沪深300涨幅 = ”1日涨幅 - #Bench.Change.000300“
上证指数20天移动平均 = “MA2(#Bench.Close.000001,20)” 注意: 对大盘指数做移动平均,需要使用MA2。
上证指数20天Bias = “#Bench.Close.000001 / MA2(#Bench.Close.000001,20) - 1”
相对沪深300市盈率差值 = “市盈率 - #Bench.PE.000300"


所有的使用大盘变量的窗口函数都要加个”2“作为后缀, MA2, Max2, Min2, EMA2, Sum2,  Stdev2.

十六、季报指标函数。 季报函数只能用于季报指标计算。  
RefQ(季报指标,前移季度数N,补全选项 = 0):返回从最新季报往前N个季度的财报指标。 当季度指标为空值时, 默认最多往前找4个季度补全空值。 补全选项 = 1时, 保留空值不补全; 补全选项 =2时, 空值转换成0。 例子:RefQ(营业收入, 1):返回最新季报往前一个季度的营业收入。比如现在某只股票的最新季报是2016Q2, RefQ(营业收入, 1)是这支股票在2016Q1的营业收入, 当2016Q1营业收入为空值时,往前季度搜索非空值返回, 最多搜索到2015Q1。而RefQ(营业收入, 1,2)是这支股票在2016Q1的营业收入,  2016Q1营业收入为空值时,返回0。

TTM(季报指标, 前移季度数): 返回股票最新4个季度指标加在一起的值。例子:TTM(营业收入, 0)返回最新4个季报营业收入之和, TTM(营业收入, 4)返回1年前的4个季报营业收入之和。

SumQ(季报指标,季度数N, 前移季度数) 返回股票最新N个季度指标之和。例子SumQ(营业收入, 4, 0) = TTM(营业收入, 0)。

AvgQ(季报指标, 季度数N, 前移季度数) 返回股票最新N个季度指标之平均值 。例子AvgQ(资产合计, 4, 0)返回最新4个季度的总资产平均值;AvgQ(资产合计, 4, 4)返回4个季度前的4个季度的总资产平均值。

Annual(季报指标, 前移年数 = 0)返回季报指标的年报数据, 前移年数 = 0时, 返回最近年报数据。 例子:假设现在是2016Q2, Annual(营业收入,0)就是2015年报的营业收入,而Annual(营业收入,1)就是2014年报收入。 


AccuQ(季报指标, 前移年数 = 0返回季报指标的年内季度累计数据, 前移年数 = 0时, 返回最近季度年内累计数据。例子:假设现在最新的季报是2016Q3 AccuQ(营业收入,0)就是20161-9月的累计营业收入,而AccuQ(营业收入,1)就是20151-9月的累计营业收入。


注意: 以上季报函数只能用于一个原始季报指标, 不能用于其他类型的指标, 也不能和其它函数嵌套使用。 不合法用例:
RefQ(市盈率, 1):收盘价不是原始季报指标, 不能用RefQ()函数
RefQ(营业收入 – 营业支出, 1): RefQ只支持一个指标,不支持表达式。
RefQ(TTM(营业收入, 0), 1): 季报函数不支持函数嵌套, 可使用TTM(营业收入, 1)计算一个季度前的营业收入TTM。


--------------------------------------------------------------------------------------------------------------------------------------
创建完成后,自定义指标的使用方法和其它公共指标一样,可以用于筛选条件或排名条件中。

注意:
1. 自定义指标名里只能包含中文,英文,数字;不能包含空格,标点符号, 括号,计算符号等。 比如指标名 “5日MA(收盘价)”, “5日收盘价 - 10日收盘价”等都是不合法的指标名。当指标名不合法时,后台计算很容易出错。
2. 自定义指标表达式里使用到的公共指标名称必须和界面上的指标名字一样, 用户不能随便使用自己想到的指标名字。 比如5日均价在界面上是”5日复权均价“, 用户不能随便用其它名字表示5日均价, 例如 ”5日均价“ ”5天均线“ 都不可以。
3. 表达式里不能有负数,  比如“-1”。 用户可以用一个简单的表达式来表示负数。 比如用 "(0-1)"来表示-1。 
4. 表达式中函数名或指标名大小写不重要, 都表示一个意思。比如"max(收盘价,1)" 和 “MAX(收盘价,1)" 都是使用Max函数, 得到一样的结果。 
5. 自定义指标表达式现在即支持函数嵌套功能,也支持自定义指标之间的嵌套。 比如‘1日前10天总成交额’可以用嵌套表达式“ref(sum(当日成交额,10), 1)”, 也可以定义两个指标, 并将第一个指标嵌入第二个指标:10天总成交额 = sum(当日成交额,10) ; 1日前10天总成交额 = ref(10天总成交额 ,1)。






以下两图展示自定义指标管理器的使用方法。

图1 点击自定义Tab 中的管理图标,进入自定义指标管理器

图2 用户可以在自定义指标管理器中添加、修改、删除指标


市场择时

选股策略使用市场择时可以有效减小由整体市场波动带来的风险, 减小策略收益的最大回撤率。市场择时可分为两类,一类是趋势择时,即根据大盘指数的均线金叉死叉来判断趋势的转换。趋势择时有一定的滞后性,即大盘趋势转换一定时间后,才会发出信号。 另一类是反转择时,即抄底逃顶择时,就是在大盘跌破某个下限时转为买入,在大盘涨破上限时卖出。反转择时有一定的提前性,即大盘趋势还没有发生转换就会发出信号。在实际使用中,趋势择时更为常用,而趋势择时和反转择时可以结合使用。

趋势择时

趋势择时有4个技术面指标,分别是MA(移动平均),MACD,DMA(平均线差指标),和TRIX(三重指数平滑移动平均指标)。当指标出现金叉时, 转为牛市,即买入; 当指标出现死叉时,转为熊市,即卖出。大盘指数默认为上证指数,用户可以在指标编辑界面选择其它主要大盘指数和行业指数。

MA金叉和死叉的判定条件

DMA = MA短线 – MA长线 (MA短线默认为上证5日均线, MA长线默认为上证60日均线。)

金叉条件: MA短线(t) > MA短线(t-1) and DMA (t) > 0 and DMA (t-1) < 0

死叉条件 MA短线(t)< MA短线(t-1) and DMA (t) < 0 and DMA (t-1) > 0

其中‘XX(t)’表示当日的指标, ‘XX(t-1)’表示前一日的指标。 以下公式皆同。

MACD金叉和死叉的判定条件

DIF(快线) = EMA短线 - EMA长线 (EMA短线默认为上证12日指数移动平均线,EMA长线默认为上证26日指数移动平均线。)

DEA(慢线)= EMA(DIF, M ) (DEA 默认为DIF的9日指数移动平均线。)

金叉条件:DIF(t) > 0 and DIF(t) >DIF(t-1) and DIF (t) > DEA(t) and DIF (t -1) < DEA(t-1)

死叉条件:DIF(t)<0 and DIF(t) < DIF(t-1) and DIF (t) < DEA(t) and DIF (t -1) > DEA(t-1)

DMA金叉和死叉的判定条件

DMA = MA短线 – MA长线 (MA短线默认为上证5日均线, MA长线默认为上证60日均线。)

AMA = MA(DMA, M) (AMA默认为20日DMA移动平均)

金叉条件: DMA(t) > DMA(t-1) and DMA (t) > AMA (t) and DMA (t -1) < AMA (t-1)

死叉条件:DMA(t) < DMA(t-1) and DMA (t) < AMA (t) and DMA (t -1) > AMA (t-1)

TRIX金叉和死叉的判定条件

TR = EMA(EMA(EMA(上证指数,N),N),N) (N默认值为120天)

TRIX = (TR(t) – TR(t-1))/TR(t-1)

MATRIX = MA(TRIX, M) (M默认为5天)

金叉条件: TRIX(t) > TRIX (t-1) and TRIX (t) > MATRIX (t) and TRIX (t -1) < MATRIX (t-1)

死叉条件: TRIX(t) < TRIX (t-1) and TRIX (t) < MATRIX (t) and TRIX (t -1) > MATRIX (t-1)

用户可以点击择时条件的编辑图标来修改条件参数。

成交量均线择时

成交量均线择时(MAVol金叉死叉)也是趋势择时的一种。 MAVol是指数成交量的多日均线。量在价先, 根据大盘成交量趋势来判定牛熊有可能比只用价格来判定取得更好的效果。

MAVol金叉死叉的判定条件

DMAVol = MAVol短线 – MAVol长线 (MAVol短线默认为上证5日成交量均线, MA长线默认为上证60日成交量均线。)

金叉条件: MAVol短线(t) > MAVol短线(t-1) and DMAVol (t) > 0 and DMAVol (t-1) < 0

死叉条件 MAVol短线(t)< MAVol短线(t-1) and DMAVol (t) < 0 and DMAVol (t-1) > 0

反转择时

反转择时根据主要板块两个基本面指标PE(市盈率)和PB(市净率)来实现。当PE小于某个值时,市场过于悲观,可以抄底买入,发出牛市信号,即买入信号;当PE大于某个值时,市场过于疯狂,需要逃顶卖出,发出熊市信号,即卖出信号。PB择时的工作机制和PE相同。板块默认为全市场,用户可以自己选择主板,中小板和创业板作基本面择时。

趋势加反转择时

MA_Bias 均线择时附加根据乖离率的逃顶和抄底。 设计源于网络大V持有封基的乖离率择时。

这个择时需要设置4个参数, MA短线和MA长线是MA择时参数, 金叉就是牛市, 死叉就是熊市。

当MA短线高于MA长线超过上限(默认10%)时,转为熊市逃顶。 当MA短线低于MA长线超过下限时(默认-10%)时, 转为牛市抄底。

同时使用多个择时条件

一个策略可以同时使用多个技术面条件来判断大市的牛熊转换。 比如一个策略同时使用了3个择时条件, 在策略回测的高级设置中,用户可以分别指定牛市转换需要满足几个条件, 熊市转换需要满足几个条件,比如这三个条件同时满足牛市条件才能转牛,但只要其中2个满足熊市条件,就能转熊。

限制

市场择时条件只对策略回测有效,不影响每日选股或者排名分析的结果。

策略回测计算只在调仓日根据牛熊条件判定买或者不买股票,不会在调仓周期中间某一天买入或卖出股票。

市场择时条件


交易模型

果仁策略研究界面将策略定义分成三个主要部分:选股、择时、交易。 选股设置包括筛选条件和排名条件,择时设置就是市场择时,交易设置包含交易模型I--定期轮转重平衡仓位的交易模型 和交易模型II--根据是否满足卖出条件来作轮转。(目前基金策略只支持交易模型I。)

交易模型I是果仁原有的定期轮动模型, 在每个调仓日,卖出不满足选股条件的股票,买进满足选股条件的股票, 所有仓内股票在调仓日重新平衡为等权重(除了那些因停牌或涨跌停而无法操作的股票)。 这种模型尤其适合快速轮动短周期策略。

交易模型II是果仁新加入的交易模型, 其特点是必须有单独的卖出条件。现在用户可以定义4个卖出条件,排名名次大于某个阈值,持有天数大于某个阈值, 止盈和止损。仓内股票只要满足一个卖出条件,就会被卖出,也就是说卖出条件之间是或的关系。 在调仓日, 策略首先会卖出可以卖出的股票,然后使用仓内资金买入符合买入条件的股票。 当仓内资金过少时(少于理想仓位的10%),就无法买入新股票。 当股票不满足卖出条件时, 就会被继续持有。 所以如果卖出条件发生不频繁,即便是调仓周期只有1天, 交易模型II的买卖次数也会比较少。 相对于模型I,模型II的交易次数会比较少, 而且个股的仓位一般不做重新平衡。

在交易模型I里, 用户直接指定持仓股票个数, 而在交易模型II里, 用户使用个股理想仓位来间接指定持股股票个数。 比如理想仓位是10%, 则策略尽量用10% 的仓内资金买入新股票,策略大约持仓10只股票。 用户可以设定仓位偏离比例,只要在理想仓位的偏离比例内, 个股仓位不作调整。 比如理想仓位是10%, 仓位偏离比例是30%,则股票仓位的合理范围是 7% 到13%, 在这个范围内,仓位不作调整。 当股票仓位低于这个范围而且在买入清单前面,则补仓至(尽量)理想仓位; 当股票仓位高于这个范围, 则卖出部分仓位,仓位调回到理想仓位。

在交易模型II里, 用户还可设置新股票买入限制。进一步过滤来自于选股策略的买入清单。在买入清单的股票只要不满足一个限制, 就会被过滤掉。注意:用户必须设置至少一个卖出条件, 但不必设置买入限制。 不设置买入限制,从选股策略来的所有股票都会被尝试买入。

选择模型I或模型II?

模型I更简单且容易理解,我们建议新用户首先使用交易模型I来研究策略。 模型II不会在每个调仓日自动平衡仓位,交易频率较低,相对来说更容易操作。而且单独的卖出条件使模型II更加灵活。一些实盘的用户可以尝试使用模型II。

模型I策略如何变成摸型II策略?

比如下图1中模型I策略, 选股条件为成交量 > 0,按价格从小到大排序, 调仓周期为5天, 持仓股票为10只。这个策略买入价格最低的10只非停牌股票, 每5天调一次仓。 转换到模型II策略时, 选股条件不变,调仓周期可依然设为5天, 而理想仓位为10%, 即表示策略大约可以持有10只股票。 卖出条件为排名名次大于等于11, 即如果排名不在10名以内就卖出。这样设置的模型II可以和模型I有类似的结果.

模型I变成模型II

图1 模型I变成模型II。

模型I和模型II有些不兼容的设置。 股票备选买入数量在模型I里可以被修改为0到20之间的任何数字,在模型II里,股票备选只数固定为5只, 用户不可调。 在模型I里, 个股最大买入仓位默认为100%,意思是如果选股策略选出来的股票只能买入1只,那么100%的资金会投入到同一只股票里。 在模型II里,个股最大买入仓位就是理想仓位,无论选出1只股票还是10只股票, 都使用10%的仓位买入。模型I里不允许仓位偏离,在每个调仓日都要重新平衡所有股票的仓位, 在模型II,股票仓位在一定范围内不用调整。以上区别使同一个选股策略在模型I和模型II之间收益不同。

模型II可以实现更严格的买入限制:比如只买入排名在前5名的股票(不设这个限制,则和模型I类似,前10名股票+5只备选股票都可以被买入)。仓内同行业的股票不超过3只,以分散行业风险。 距离上次卖出间隔大于等于20天, 这样刚卖出的股票不会在下一个调仓或下几个调仓日被买入。 (模型II默认在调仓日卖出的股票不会再同一调仓日买入。) 这个限制可以防止止损股票被立即买回的情况。加入这些买入限制后, 一次能被买入的股票就会变少,这时缩短调仓周期,比如设置调仓周期为1天,可以实现逐步建仓的策略,这样不必在一天只内一定要买入10只股票。

在卖出条件里,可以适当放宽按排名卖出的条件,比如到排名20名以后才卖出, 这样可以减少交易频度。用户还可以按照持有天数卖出, 一只股票在仓内最长可以持有100个交易日,过了这个时期,无论排名再高,也要卖出。 止赢止损也分别可以设置条件。

模型I变成模型II

图2 模型II的参数设置。

图2显示了比图1 更复杂的模型II交易策略。所有的买入限制和卖出条件都被设置,调仓周期缩短为一天。 通过这些交易条件的设置, 我们可以看到模型II可以实现较为复杂的交易策略。

回测效果对比

将同样选股策略做过去4年回测, 图1模型I和图2模型II得到的结果在图3和图4中展示。

模型I变成模型II

图3 模型I的回测结果

模型I变成模型II

图4 模型2的回测结果。

我们可以看到模型II交易策略可以减小最大回测率,增加夏普比率。注意在这里作者只是为了讲解目的,并没有对模型II交易策略作任何调优。模型II有可能得到比模型I更好的结果。

牛熊转换的仓位控制

牛转熊时, 比如熊市仓位是30%, 在模型I里, 尽量将总仓位压到30%, 如果有的股票停牌无法减仓,其它股票的仓位会减小更多; 在模型II里, 30%一方面代表总仓位的30%, 另一方面是指个股理想仓位的30%, 比如牛市里个股理想仓位是20%, 则在熊市里个股理想仓位为6%, 每只股票的仓位都会尽量向理想仓位靠, 从而达到减仓至30%的目的。 特殊情况是碰到停牌或涨跌停导致股票无法减仓, 此时会继续以理想仓位(6%)持有不符合卖出条件的个股; 而对于达到卖出条件的个股, 将其卖出后如果仓位大于熊市仓位即30%, 则不会买入新的股票。 如果卖出后小于熊市仓位, 则会根据排名条件依次以理想仓位(6%)买入新的股票, 直到达到熊市仓位。

熊转牛时, 模型I会将总仓位升到100%, 满仓平权买入股票; 模型II会将个股理想仓位复原, 仓内的股票和新买入的股票仓位都会尽量向理想仓位靠拢。

排名分析是否受到交易模型的影响?

交易设置只影响策略回测的结果, 对每日选股和排名分析都没有影响。 排名分析使用类似于模型I的交易模型, 但不会考虑停牌涨跌停的影响。它只受到选股设置的影响, 完全忽略市场择时设置和交易设置。

调仓指令

果仁有两个交易模型, 模型I和模型II, 它们的调仓指令有不同的含义。

模型I调仓

模型I是一个定期调仓并且重新平衡仓位的交易模型。模型I对持仓股票的最大数量做出了规定, 比如最多持有5只股票, 意思就是在每个调仓日策略都试图买入或持有5只股票, 每只股票的仓位是20%, 当可以买入的股票数小于5只时,比如只有3只,策略会按照33%的个股仓位买入3只股票。 (用户可以改变个股最大买入仓位100%的设置,设为比如20%, 在这种情况下,即便只能买入3只股票,策略依然会按照20%的个股仓位买入3只股票,空出40%的仓位为现金。)

调仓指令有5个信号, 卖出, 持有,买入,持有(备选),买入(备选)。 仓内的股票如果不符合选股条件, 就要被卖出, 如果依然符合选股条件,则继续持有。 卖出股票空出来的资金就可以买入新的符合条件的股票。两个备选信号的目的是为了应对由于停牌或涨跌停而引起的股票不能买卖的情况。信号是买入的股票有可能停牌或一字涨停而无法买入, 这时策略将会试图买入排在前列的备选股票,标记为买入(备选)。 如果被持仓的股票也在备选名单里,这只股票的信号就是持有(备选), 意思是如果排在它前面的股票可以被买入, 则卖出这只股票, 如果排在前面的股票不能被买入,则可以继续持有这只股票。

备选股票的数量默认是5只, 用户可以在0只(也就是不要备选)和20只之间做调整。

模型I调仓指令首先列出需要卖出的股票, 然后按排名顺序列出需要买入或持有的股票, 排在最大持有只数以外的股票会标记为备选。 举个例子, 一个模型I策略最多持有2只股票, 备选股票数为5只。当前持仓的股票为 股票A(60%)和股票B(40%)。调仓日的调仓指令是:

1. 股票A 卖出 
2. 股票C 买入 
3. 股票D 买入 
4. 股票B 持有(备选) 
5. 股票E 买入(备选) 
6. 股票F 买入(备选) 
7. 股票H 买入(备选) 
8. 股票G 买入(备选) 

以上调仓指令,如果没有停盘和涨跌停这些复杂的因素,调仓结果就是卖出A和B, 买入C和D, C和D的仓位各是50%。

以下例子列出一些停牌情况的调仓结果:

停牌情况      调仓后持有股票 
C停牌        B(50%)和D(50%) --卖出A, 无法买入C,顺位买入D和继续持有B。B和D的仓位重平衡。 
B和C停牌     B(40%)和D(60%) --卖出A, 无法买入C,顺位买入D和继续持有B。B的仓位不变。 
C和D停牌     B(50%)和E(50%) --卖出A,无法买入C 和D, 顺位继续持有B和买入E。 B和E的仓位重平衡。 
A停牌        A(60%)和C(40%) --无法卖出A,只有一个空位,卖出B, 买入C。 A的仓位不变。 
B停牌        B(40%)和C (60%) --无法卖出B, 只有一个空位,卖出A买入C。 B的仓位不变。 

以上策略,在调仓后,仓内两只股票的仓位将尽量调整为50%,即便是A和B一直持有下去它们的仓位也会每次重平衡为50%。 当A和B有停牌的情况时, 停牌股票的仓位不变。 模型I仓位总的原则是:当仓内股票停牌时,这只股票的仓位保持不变, 余下的资金平均买入或持有股票。

一字涨跌停会使一只股票不能买或不能卖,处理方式和停牌一样。 比如,当A一字跌停时,无法卖出,按照A停牌处理。 当C和D一字涨停时,无法买入, 按照C和D停牌处理。当B一字跌停时, 无法卖出, 按照B停牌处理, B一字涨停时,无法买入补平仓位。

模型II调仓

模型II定期卖出符合卖出条件的股票,再用空下的资金按顺序买入在清单里的股票。和模型I不同, 模型II不规定最多持仓股票数,而是规定个股理想仓位。 比如想持有两只股票的策略可以设定理想仓位为50%。当策略买入新股票时,将尽量按照50%的总仓位买入新股票,如果仓内资金不足50%, 则能买多少是多少。 当仓内资金小于理想仓位的十分之一时,则不再买入新股票,以避免造成碎片化持股。比如理想仓位是50%时, 仓内资金小于5%, 则不再买入新股票。 和模型I的一个重要区别是模型II有仓位偏离比例概念, 也就是说只要股票仓位在理想仓位的偏离范围之内,在调仓日就可以保持现有仓位,不作重新平衡。 如果股票仓位在偏离范围之外, 在调仓日就需要减仓或补仓。 比如理想仓位是50%,仓位偏离范围是30%, 则这只股票的最低合理仓位是 50% * (1 - 30%) = 35%, 最高合理仓位 50% * (1 + 30%) = 65%。 当股票仓位高于65%时, 策略会减仓这只股票到理想仓位;当股票仓位低于35%时, 而且被策略选中时,会尽量加仓至理想仓位。

模型II的调仓信号有5个, 卖出,减仓至目标仓位, 持有, 买入,加仓至目标仓位。 (目标仓位也就是理想仓位。)当仓内股票符合一个卖出条件时, 就被卖出; 当仓内股票不符合卖出条件时, 有三种情况, 第一种情况是仓位在偏离范围之内, 维持原有仓位不变, 标记为持有;第二种情况是仓位高于最高合理仓位, 减仓至理想仓位,标记为减仓至目标仓位; 第三种情况是仓位低于最低合理仓位而且被策略选中,加仓至理想仓位, 标记为加仓至目标仓位。一只新股票被策略选中时,将按理想仓位买入, 标记为买入

模型II也有备选股票的概念, 备选只数固定5只。 比如调仓日需要买入1只股票,模型II会推荐 1+5 = 6只买入(或加仓)的股票。 意思是如果排在前面的股票能买入, 就买入, 如果不能买入, 就试图买入排在后一名的股票,直到可以买入股票为止或者扫描完买入清单为止。 当策略有较严格的买入条件时, 比如在新股买入限制里设定排名名次小于等于3, 备选股票可能小于5只股票。

使用一个和模型I类似的例子,一个模型II策略的理想仓位是50%,仓位偏离范围是30%。 备选股票数为5只。当前持仓的股票为 股票A(60%)和股票B(40%)。调仓日的调仓指令是:

1. 股票A 卖出 
2. 股票B 持有 
3. 股票C 买入 
4. 股票D 买入 
5. 股票E 买入 
6. 股票F 买入 
7. 股票H 买入 
8. 股票G 买入 
 

模型II调仓指令首先列出需要卖出和减仓的股票, 然后列出继续持有的股票, 最后列出需要买入和加仓的股票。

上例中股票A满足卖出条件, 需要卖出。 股票B的仓位是40%, 在合理的仓位范围(35%到65%)之内,所以仓位不变,继续持有。 接下会有6股票按先后顺序在买入清单里。 如果所有的股票都可以买卖,调仓的结果是 B(40%),C(50%), D(10%)。也就是卖掉股票A后,将得到60%资金, 用50%买入C,用剩下的10%买入D。 (这里需要注意的是个股的仓位权重是按照调仓日前一天的收盘价算出, 在调仓日, 由于股票价格波动,股票的仓位会变化, 所以股票A被卖出后,得到的资金有可能比60%多,也有可能比60%少, 所以C和D 的仓位,尤其的是D的仓位,会根据调仓日的实际情况作出决定。 这里只是为了说明方便, 忽略价格波动引起的仓位变化。)

以下列出一些停牌情况和调仓结果的例子:

停牌情况      调仓后持有股票 
C停牌        B(40%),D(50%), E(10%)  --卖出A, 无法买入C,顺位买入D和E。 
A 停牌       A(60%), B(40%) 			--无法卖出A, 无法调仓。 
C和D停牌     B(40%),E(50%),F(10%)   --卖出A,无法买入C 和D, 顺位买入E和F。

以上例子表明, 模型II会尽量按理想仓位买入新的股票, 当资金不足时, 也会买入部分仓位的股票,而不是让资金闲置。比如用50%的仓位买入C, 用10%的仓位买入D,这时D的仓位小于最小合理仓位35%,所以到下一个调仓日, 如果有足够资金而且D排在股票清单前列,将被加仓。

模型II另一特点是不会频繁自动平衡仓位,只要个股仓位在合理范围之内,仓位就保持不变,这和模型I在每个调仓日重平衡仓位很不一样。

以上所介绍的都是果仁量化引擎如何去执行调仓指令,果仁的调仓历史和实盘收益是按照这一套规则计算出来的。 用户在实际执行调仓指令时,在仓位和买卖价格方面必然会有一些差别, 最后的结果可能比果仁的结果好也有可能比果仁的结果差。

股票池示例

用户有很多时候需要在指定的几只股票或几只基金里制作轮动策略, 比如在4只银行股票里轮动或者在两个基金里做二八轮动。 这时候, 就需要使用股票池(或者基金池)。

一个股票池可被看作一个自定义投资域,股票池功能可以让用户为策略设定一个更灵活的投资域。 用户可以到我的主页里创建股票池. 股票池分为三种:静态股票池,动态股票池和合成股票池静态股票池是一个手工键入的股票代码集合(或者拷贝粘贴一个股票代码表)。静态股票池是最常用的一个股票池,使用静态股票池用户可以实现几只股票之间的轮转策略,比如几个银行股票之间的轮转策略。 动态股票池是根据选股条件和排名条件产生的动态股票集合,股票清单可以每日动态变化。 使用动态股票池,用户可以实现分层量化策略,也就是将筛选排名条件分在两步里完成,这样策略的表达能力更强。比如用户可以首先创建一个动态股票池: 总市值和股价综合排名最小的100只股票,然后再在这个股票池里面选择市盈率最小的10只股票。动态股票池创建界面和策略创建界面及其相似,只是更简单些,没有策略回测那些设置。合成股票池可以实现两个股票池之间的集合操作, 目前合成股票池的功能还很简单,只实现了黑名单的功能。 也就是股票全集减去黑名单股票池。

创建股票池在个人主页的股票池页进行。一经创建,就可以在创建股票策略->选股设置页面里的选择范围使用股票池。 选择范围默认是全部股票, 用户可以通过下拉菜单看到可以使用的股票池。

基金池和股票池基本一样,区别是基金池里的代码都是基金代码,而股票池里的代码是股票代码。基金池目前不支持动态基金池, 只有静态基金池和合成基金池。 除了基金以外,静态基金池还可以放入指数代码, 支持指数回测。 比如对上证指数进行回测,可以创建一个静态基金池,键入上证指数代码“000001I”, 在果仁网里,所有的A股指数代码都有一个”I”(大写的i)后缀,以区别于股票/基金代码。

股票池使用示例

示例1 四大银行轮动策略

1 在个人主页—>股票池, 点击’+’图标,首先选择股票池类型, 如下图:

选择股票池类型

2创建一个4大银行的静态股票池, 我们可以将四大银行(即工商银行 601398,建设银行 601939,农业银行 601288,中国银行601988)的股票代码直接输入到股票列表里,然后点击保存。如下图:

四大银行

3 创建股票池完毕后,去创建股票策略->选股设置页面,“四大银行”股票池出现在选择范围的下拉菜单里,如下图。

创建股票策略

4选择四大银行股票池, 就可以制作在四大银行之间轮动的量化策略。使用每日选股可以确认股票池里的股票确实是四大银行。 如下图。

量化策略

5然后可以创建一个量化策略, 持有市盈率最低的一只四大银行股票, 每20个交易日轮动一次。 最近4年的总收益是58.9%,在同一时间段沪深300的总收益只有-1.21%。 这么一个简单的量化轮动策略可以轻易战胜沪深300。如下图

策略结果


示例2 排除四大银行的银行股轮动策略

有用户认为四大银行没有增长潜力, 需要制作非四大行的银行量化轮动策略。 这时候,可以将四大银行股票池作为黑名单,从股票中排除。

1 在个人主页->股票池页面, 创建一个合成股票池“排除四大行“, 定义是”全部股票 排除 四大银行“。

排除四大行

2 在创建股票策略->选股设置页面,选择范围设定为“排除四大行“,行业为 “银行”, 通过每日选股, 可以看到银行股票列表里已经排除四大行。 如下图。

排除四大行

3 现在可以制作出一个非四大行的银行个量化策略。 比如按照示例1的公式做出一个最小市盈率非四大行银行股策略, 最近四年的总收益是181%。如下图。

排除四大行


示例3 指数轮动回测

ETF轮动策略可以使用静态基金池来完成,流程类似于上面两个例子。ETF策略的一个缺点就是历史不够长, 用户可以使用指数来做出更长时间的轮动策略。

1 比如创建一个沪深300 和中小板指数的轮动策略。首先可以创建一个指数池,叫做“沪深中小指数轮动”如下图:

指数的轮动

这里需要注意指数代码后面需要加一个后缀”I”(大写的i), 以便和股票基金代码区别。

2 比如创建一个沪深300 和中小板指数的轮动策略。首先可以创建一个指数池,叫做“沪深中小指数轮动”如下图:

指数池

3设置选股排名条件进行回测, 步骤类似上例, 省略。


示例4 动态股票池示例

使用动态股票池可以做出更加复杂或更加灵活的选股策略。比如从市盈率最小的100只股票里选出市值最小的5只股票持有策略。

1 创建一个叫做“小PE100”的动态股票池,定义是市盈率最小的100只股票。下图显示这个动态股票池的定义。

小PE100

2 基于这个股票池创建一个市值最小的5只股票策略。如下图设置

5只股票

5只股票

3 最近4年的回测结果如下:

回测结果



果仁网要解决的问题

股民选股有不少办法,听朋友推荐,看新闻热点,跟随大神,使用几个常用的技术指标。但是这些选股方法都缺乏科学的评估方法。比如一个股票在过去一个月涨势喜人,在未来一定的时间段上涨的机率到底是多大?回答这种问题,光凭直觉和信心是不够的,因为直觉和信心可以随着市场波动瞬间消失;光凭书本上的死规则也是不够的,因为在股市上没有一成不变的赚钱规则。

专业投资者和一般股民最大的差别是专业投资者有能力将选股策略放回到真实的历史数据中回测,做出客观的评估。

专业投资者的投资流程大致分为3步:

在果仁网上,股民可以使用鼠标点击在几秒之内创建选股策略,并在真实的历史数据中评估策略的有效性。有了这个能力,业余人士和专业人士的差距就大大缩小了。

果仁网的选股策略和回测流程是基于以下投资理念而设计的:

用户首先选择几类指标制定选股策略, 然后查看每日选股结果, 如果符合预期,可在历史的日期区间进行回测。下图展示使用流程,非常简单。

图片描述

图片描述

历史回测的复杂性

历史回测一直是专业投资人的利器,但要做到真实还原历史(point-in-time), 专业分析员需要花费几个星期的编程时间。那么真实还原历史有哪些复杂点?以下举几个例子:

以上只是真实还原历史的一部分复杂点。即便是专业投资者也需要花费很多资源来解决真实还原历史的问题,对于严肃的业余投资者来说,想在真实的历史数据作回测,到目前为止,基本是不可能的。果仁网为一般用户提供了真实的历史回测平台,为理性评估选股策略是否会赚钱提供了可能。

联系我们

关注公众号

加入QQ群

更新日期:2017-01-23