提高量化策略收益的三个排雷方法

from:https://guorn.com/forum/post/p.119494.112112125741704?tag=share

量化投资相比主观投资,通常持股数量更多更分散,有的量化策略为了获得稳定α甚至持有上百只股票。所以,我们在实际的投资中,很可能因为整个策略持有的股票数量过多,不慎踩中地雷。

本文就向大家介绍几个投资实战中容易出现的雷,以及在果仁网上对应的排雷方法,为你的策略构筑第一道防火墙。

 

暴雷指标1:近期有配股

配股是指向原股票股东以低于市价配售一定数量股票的融资行为。但是对于短期持有股票的投资者,如果没有额外资金进行配股,自己的股份就会被稀释。一般公司发布配股公告前,如果不希望参与配股,要尽快将股票卖出。

以近期发布了配股公告的一家公司,北京科锐为例。该公司在5月15日发布了配股发行公告,在5月18日就开始停牌。如果没有留意到配股公告的信息,那么复牌除权后,持有该股票的投资者就会立即亏损12%左右。

大部分公司配股对股价后期的走势偏负面。而在量化策略中如果不慎买入此类股票,而策略买入后没有追加资金,将白白承受亏损。

(最近有发布配股公告的公司,银信科技,配股前后的股价走势。)

 

排雷指标使用方法:

在果仁网制作策略时,使用近期配股标记就可以将此类股票过滤掉。

近期配股标记为1时,表示公司将在近期配股或者正在执行配股。不打算增资配股,可以在停牌前卖掉标记为1的股票

 

 

暴雷指标2、重大违规公司

重大违规事件包括对公司或其重要人员的调查、市场禁入、刑事等问题。证监会发布行政处罚后,对应公司的股票也会有较大的负面影响。

通过每日选股功能,可以查看近20日存在重大违规处罚的公司名单:

这16只股票近20个交易日的跌幅,平均数是-5.86%,中位数是-9.33%可见这类公司的股价明显会受到处罚的影响,因此,我们也应该明确的回避。

排雷指标使用方法:

使用重大事项违规处罚标记就可以将此类股票过滤掉。

重大事项违规处罚标记为1,表示当天发生重大事项违规处罚,0表示没有重大事项违规处罚。也可以使用过去N日重大违规数量指标,该指标可以在过去任意天,寻找有重大违规事件的公司。

指标位置:

暴雷指标3、“非标”审计意见

上市公司的年报在发布之前都会进行审计,大部分上市公司会获得标准无保留意见的审计结果,获得“标准”意见的年报数据,才有看的价值。

无法获得会计师出具的标准无保留意见的审计报告,我们统一称为“非标”审计意见。下图是雪球的大V唐朝总结的五种会计师出具意见及相应解读:

实际上,每年被出具非标准审计意见的上市公司并不在少数,而且近几年有愈演愈烈的趋势:

今年被出具“非标”审计意见的上市公司达到了2010年以来的峰值水平。

这类股票年度总体收益的统计如下图所示:

可以明显看到,这类“有问题”的股票,在15年之前表现良好,但是从17年后,这种现象就被完全逆转了。

这类股票明显的特征是:要么是小市值股票,要么是ST股票。以今年这127只股票为例,小于50亿市值的股票多达79只。ST股票有46只。

现在A股的投资者越来越重视财报的数据及公司的盈利质量,尤其在16年底蓝筹股崛起后, “炒小、炒ST股票”的逻辑在近两年近乎失效。

而无法被出具“标准无保留意见”的上市公司如前所述大部分市值集中在50亿以内,属于典型的小市值股票。在快速趋于成熟的A股市场,未来这类股票也应尽量回避。

排雷指标使用方法:

使用年报审计意见指标可以标记出“非标”审计意见

在果仁系统中:

年报审计结果为:“标准无保留意见”标记为1

年报审计结果为:“附带说明的无保留意见”标记为2

年报审计结果为:“保留”、“无法出具”、“拒绝”以及未经审计标记为3

如果想选出“非标”审计意见的公司,就可以将筛选条件设置为“年报审计意见>1”

如果想过滤掉“非标”审计意见的公司,可以将筛选条件设置为“年报审计意见=1”

指标位置:

总结

每天盯着公告手工排雷,难免会有漏网之鱼。而如果将上面的三个指标加入你的量化策略,在未来就可以不再为是否会意外买到“地雷股”而担心了。这三个指标既可以作为筛选条件,融入策略,也加以制作为一个自定义股票池,灵活调用。

ETF为了减小跟踪误差往往会一篮子买入全部股票,而不进行个股的甄别。量化策略在持有较多数量股票时,如果进行上述的排雷设置,进行更精细化的处理,相对比较基准,日积月累可以带来更多的超额收益。

 

更多数据及量化咨询欢迎关注公众号:果仁网

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的排雷游戏的C语言代码: #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 10 #define COLS 10 #define MINES 10 void init_board(char board[][COLS], int rows, int cols, char ch); void print_board(char board[][COLS], int rows, int cols); void set_mines(char board[][COLS], int rows, int cols, int num_mines); void get_neighbors(char board[][COLS], int rows, int cols, int row, int col, int *n, int *s, int *e, int *w, int *ne, int *nw, int *se, int *sw); void reveal(char board[][COLS], char mask[][COLS], int rows, int cols, int row, int col); int count_mines(char board[][COLS], int rows, int cols, int row, int col); int main(void) { char board[ROWS][COLS]; char mask[ROWS][COLS]; int row, col, num_mines, num_revealed; srand((unsigned)time(NULL)); init_board(board, ROWS, COLS, '-'); init_board(mask, ROWS, COLS, '*'); num_mines = MINES; set_mines(board, ROWS, COLS, num_mines); num_revealed = 0; while (num_revealed < ROWS * COLS - num_mines) { print_board(mask, ROWS, COLS); printf(&quot;Enter row and column (e.g. 3 4): &quot;); scanf(&quot;%d %d&quot;, &row, &col); if (board[row][col] == '*') { printf(&quot;BOOM! Game over.\n&quot;); break; } reveal(board, mask, ROWS, COLS, row, col); num_revealed++; } if (num_revealed == ROWS * COLS - num_mines) { printf(&quot;Congratulations! You win!\n&quot;); } return 0; } void init_board(char board[][COLS], int rows, int cols, char ch) { int i, j; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = ch; } } } void print_board(char board[][COLS], int rows, int cols) { int i, j; printf(&quot; &quot;); for (j = 0; j < cols; j++) { printf(&quot;%d &quot;, j); } printf(&quot;\n&quot;); for (i = 0; i < rows; i++) { printf(&quot;%d &quot;, i); for (j = 0; j < cols; j++) { printf(&quot;%c &quot;, board[i][j]); } printf(&quot;\n&quot;); } } void set_mines(char board[][COLS], int rows, int cols, int num_mines) { int i, j, k; for (k = 0; k < num_mines; k++) { do { i = rand() % rows; j = rand() % cols; } while (board[i][j] == '*'); board[i][j] = '*'; } } void get_neighbors(char board[][COLS], int rows, int cols, int row, int col, int *n, int *s, int *e, int *w, int *ne, int *nw, int *se, int *sw) { *n = (row > 0) ? board[row - 1][col] : 0; *s = (row < rows - 1) ? board[row + 1][col] : 0; *e = (col < cols - 1) ? board[row][col + 1] : 0; *w = (col > 0) ? board[row][col - 1] : 0; *ne = (row > 0 && col < cols - 1) ? board[row - 1][col + 1] : 0; *nw = (row > 0 && col > 0) ? board[row - 1][col - 1] : 0; *se = (row < rows - 1 && col < cols - 1) ? board[row + 1][col + 1] : 0; *sw = (row < rows - 1 && col > 0) ? board[row + 1][col - 1] : 0; } void reveal(char board[][COLS], char mask[][COLS], int rows, int cols, int row, int col) { int n, s, e, w, ne, nw, se, sw, num_mines; if (mask[row][col] == '-') { mask[row][col] = board[row][col]; if (board[row][col] == ' ') { get_neighbors(board, rows, cols, row, col, &n, &s, &e, &w, &ne, &nw, &se, &sw); if (n == '-') reveal(board, mask, rows, cols, row - 1, col); if (s == '-') reveal(board, mask, rows, cols, row + 1, col); if (e == '-') reveal(board, mask, rows, cols, row, col + 1); if (w == '-') reveal(board, mask, rows, cols, row, col - 1); if (ne == '-') reveal(board, mask, rows, cols, row - 1, col + 1); if (nw == '-') reveal(board, mask, rows, cols, row - 1, col - 1); if (se == '-') reveal(board, mask, rows, cols, row + 1, col + 1); if (sw == '-') reveal(board, mask, rows, cols, row + 1, col - 1); } } } int count_mines(char board[][COLS], int rows, int cols, int row, int col) { int n, s, e, w, ne, nw, se, sw, count; get_neighbors(board, rows, cols, row, col, &n, &s, &e, &w, &ne, &nw, &se, &sw); count = 0; if (n == '*') count++; if (s == '*') count++; if (e == '*') count++; if (w == '*') count++; if (ne == '*') count++; if (nw == '*') count++; if (se == '*') count++; if (sw == '*') count++; return count; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值