打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
次新股开板投资攻略

次新股简单粗暴的买入策略!

最近一段时间,次新股概念非常火,市场关注度也非常高。前面卢威大神已经发布了关于次新股投资研究的帖子:新股、次新股的投资机会研究 ,总结一下这里面的内容,主要的观点有:

  1. 行业对次新股影响比较大

  2. 市值较小的次新股往往会带来更高的超额收益

  3. 需要和同行业的其他的股票进行横向对比,一字板数量要小于同行业的股票

最近发现国君也发了一篇关于次新股的研报,主要观点和上面会有一些不同,从另外的视角来筛选次新股,个人感觉也挺有借鉴意义,在这里简单实现一下。

国君研报中选次新股的条件有4个,股社区也做了相应的总结:

  1. 上市连续涨停<>

  2. 同一天开板新股>1个

  3. 无分析师覆盖

  4. 牛熊分界处于熊市一侧(可以替换为399678低于20日线)

其中同一天开板新股大于1个,主要的观点就是当天有多只股票开板的话,可能不是个股的原因,而是因为大盘的原因,被错杀了。第四个条件中牛熊分界处于熊市一侧也是基于同样的考量。

因为第三个条件没有比较好的数据实现,这里将其他3个选股条件都用上,分析一下最终的结果。

最近一段时间,次新股概念非常火,市场关注度也非常高。前面卢威大神已经发布了关于次新股投资研究的帖子:新股、次新股的投资机会研究 ,总结一下这里面的内容,主要的观点有:

  1. 行业对次新股影响比较大

  2. 市值较小的次新股往往会带来更高的超额收益

  3. 需要和同行业的其他的股票进行横向对比,一字板数量要小于同行业的股票

最近发现国君也发了一篇关于次新股的研报,主要观点和上面会有一些不同,从另外的视角来筛选次新股,个人感觉也挺有借鉴意义,在这里简单实现一下。

国君研报中选次新股的条件有4个,股社区也做了相应的总结:

  1. 上市连续涨停<>

  2. 同一天开板新股>1个

  3. 无分析师覆盖

  4. 牛熊分界处于熊市一侧(可以替换为399678低于20日线)

其中同一天开板新股大于1个,主要的观点就是当天有多只股票开板的话,可能不是个股的原因,而是因为大盘的原因,被错杀了。第四个条件中牛熊分界处于熊市一侧也是基于同样的考量。

因为第三个条件没有比较好的数据实现,这里将其他3个选股条件都用上,分析一下最终的结果。

6
1
import seaborn
2
from matplotlib import pylab
3
import matplotlib.pyplot as plt
4
from matplotlib.pyplot import *
5
from CAL.PyCAL import *    # CAL.PyCAL中包含font
6
from datetime import timedelta,datetime,date
查看全部

1. 获取2014年6月以来的新上市的股票

1. 获取2014年6月以来的新上市的股票

7
1
security_listDate = DataAPI.EquGet(equTypeCD=u'A',secID=u'',ticker=u'',listStatusCD=u'',field=u'secID,ticker,secShortName,ListDate',pandas='1')
2
new_equity = security_listDate[(security_listDate['listDate'] > '2014-06-01') &
3
                              (security_listDate['listDate'] '2017-02-20')].reset_index(drop='False')
4
new_equity['month'] = new_equity['listDate'].apply(lambda x : int(x[0:4] + x[5:7]))  # 转换时间格式,方便统计每个月上市的股票
5
new_equity_se = new_equity.groupby('month').size()
6
print new_equity.head()
7
查看全部
secID ticker secShortName listDate month0 000166.XSHE 000166 申万宏源 2015-01-26 2015011 001979.XSHE 001979 招商蛇口 2015-12-30 2015122 002724.XSHE 002724 海洋王 2014-11-04 2014113 002726.XSHE 002726 龙大肉食 2014-06-26 2014064 002727.XSHE 002727 一心堂 2014-07-02 201407

2. 每个月上市的股票的数量统计

2. 每个月上市的股票的数量统计

12
1
#下面代码为画图的逻辑: 次新股数量统计
2
fig = plt.figure(figsize=(12, 6))
3
ax1 = fig.add_subplot(111)
4
ax1.bar(range(len(new_equity_se)), new_equity_se.values, align='center',  width=0.5)
5
ax1.set_xlim(-1, len(new_equity_se))
6
7
ax1.set_xticks(range(len(new_equity_se)))
8
ax1.set_xticklabels([str(i) for i in new_equity_se.index], fontproperties=font, fontsize=14)
9
plt.setp(plt.gca().get_xticklabels(), rotation=45)
10
ax1.set_title(u'新股上市数量', fontproperties=font, fontsize=16)
11
12
查看全部

从上图可以看到,2015年股灾结束后,新股发行的速度已经恢复常态。按照这个发行速度,现在还有700多家公司在排队IPO,未来的新股供给量应该会非常充足。

从上图可以看到,2015年股灾结束后,新股发行的速度已经恢复常态。按照这个发行速度,现在还有700多家公司在排队IPO,未来的新股供给量应该会非常充足。

3. 统计新股上市的行业信息

3. 统计新股上市的行业信息

12
1
def get_industry(secID, day):
2
   '''获取行业分类信息'''
3
   industry_df = DataAPI.EquIndustryGet(industryVersionCD=u'010303',secID=secID,ticker=u'',intoDate=day,
4
                          field=u'secID,ticker,secShortName,industryName1,isNew',pandas='1')
5
   industry_df = industry_df[industry_df['isNew']==1]
6
   return industry_df['industryName1'].head(1)
7
8
today = date.today().strftime('%Y%m%d')  
9
10
# 如果使用上市日期来查询股票行业分类,会有NaN值出现
11
new_equity['industy_name'] = new_equity.apply(lambda x: get_industry(x['secID'], today), axis=1)
12
查看全部
14
1
#下面代码为画图的逻辑: 画图展示行业信息
2
3
new_equity_industry_se = new_equity.groupby('industy_name').size()
4
5
fig = plt.figure(figsize=(12, 6))
6
ax1 = fig.add_subplot(111)
7
ax1.bar(range(len(new_equity_industry_se)), new_equity_industry_se.values, align='center',  width=0.5)
8
ax1.set_xlim(-1, len(new_equity_se))
9
10
ax1.set_xticks(range(len(new_equity_industry_se)))
11
ax1.set_xticklabels([i.decode('utf-8') for i in new_equity_industry_se.index], fontproperties=font, fontsize=14)
12
plt.setp(plt.gca().get_xticklabels(), rotation=90)
13
ax1.set_title(u'新股行业分布', fontproperties=font, fontsize=16)
14
查看全部

从上图可以看到,化工,机械设备,医药生物还有计算行业的新股比较多,这也吻合这几个行业自身成份股数量较多的特点

从上图可以看到,化工,机械设备,医药生物还有计算行业的新股比较多,这也吻合这几个行业自身成份股数量较多的特点

4. 获取股票的上市时的涨停板的个数

优矿提供了一个API,可以获取新股上市后的涨停板的个数,这个太方便了,自己要是做还是比较麻烦的:MktIpoConTraddaysGet。利用这个API,首先获取每个股票上市有多少个涨停板。

我们需要将一字板大于10天的剔除,这种股票的后续潜力已经很小了。

4. 获取股票的上市时的涨停板的个数

优矿提供了一个API,可以获取新股上市后的涨停板的个数,这个太方便了,自己要是做还是比较麻烦的:MktIpoConTraddaysGet。利用这个API,首先获取每个股票上市有多少个涨停板。

我们需要将一字板大于10天的剔除,这种股票的后续潜力已经很小了。

7
1
def get_uplimt_num(secID):
2
   '''获取新股连续涨停的天数'''
3
   df = DataAPI.MktIpoConTraddaysGet(secID=secID,field=u'continiousTradDays',pandas='1')
4
   return df['continiousTradDays'].head(1)
5
6
new_equity['uplimit_num'] = new_equity.apply(lambda x: get_uplimt_num(x['secID']), axis=1)
7
查看全部
1
1
print new_equity[new_equity['uplimit_num']1].to_html()
查看全部
secID ticker secShortName listDate month industy_name uplimit_num
0 000166.XSHE 000166 申万宏源 2015-01-26 201501 非银金融 0.0
1 001979.XSHE 001979 招商蛇口 2015-12-30 201512 房地产 0.0
232 300498.XSHE 300498 温氏股份 2015-11-02 201511 农林牧渔 0.0
355 601155.XSHG 601155 新城控股 2015-12-04 201512 房地产 0.0
605 603998.XSHG 603998 方盛制药 2014-12-05 201412 医药生物 0.0

从上面的统计信息可以看出,有些股票上市第一天就是破板了,这种情况在前一篇帖子已经分析过了,主要原因是因为这些股票不是纯正的新股,这种股票也要剔除。

从上面的统计信息可以看出,有些股票上市第一天就是破板了,这种情况在前一篇帖子已经分析过了,主要原因是因为这些股票不是纯正的新股,这种股票也要剔除。

1
1
new_equity = new_equity[(new_equity['uplimit_num']>0)&(new_equity['uplimit_num']10)]
查看全部

5. 找到新股开板的那一天

前面有上市的时间,还有连续涨停的时间,那么将上市的时间加上连续涨停的天数,即可获取开板的那一天

5. 找到新股开板的那一天

前面有上市的时间,还有连续涨停的时间,那么将上市的时间加上连续涨停的天数,即可获取开板的那一天

27
1
def get_specific_trading_day(date_str='2016-01-04', window=20, direction='forward'):
2
   '''给定日期,可以通过这个函数获取前后N天的那个交易日'''
3
   date = datetime.strptime(date_str, '%Y-%m-%d')
4
   if direction=='back':
5
       begin_day = date - (window+5) * 4 * timedelta(days=1)   # 可以获取冗余的交易日,防止最终取不到有效数据
6
       end_day = date
7
   elif direction=='forward':
8
       begin_day = date
9
       end_day = date + (window+5)  * 4 * timedelta(days=1)
10
       
11
   begin_day_str = begin_day.strftime('%Y-%m-%d')
12
   end_day_str = end_day.strftime('%Y-%m-%d')
13
       
14
   cal_dates = DataAPI.TradeCalGet(exchangeCD=u'XSHG', beginDate=begin_day_str, endDate=end_day_str, field='calendarDate,isOpen')
15
   trading_days = cal_dates[cal_dates['isOpen']==1]['calendarDate'].tolist()
16
   # trading_days = [day[0:4] + day[5:7] + day[8:] for day in trading_days] # 更改日期的格式,将'2014-01-03'转化为'20140103'
17
   try:
18
       if direction=='back':
19
           return trading_days[-window]
20
       return trading_days[window]
21
   except:
22
       print date_str,window,direction
23
       
24
       
25
#开板的那天
26
new_equity['un_limit_day'] = new_equity.apply(lambda x: get_specific_trading_day(x['listDate'], int(x['uplimit_num'])), axis=1)
27
new_equity = new_equity[new_equity['un_limit_day']'2017-02-20'] #加上相应的日期后,可能会有越界的情况
查看全部

6.找到同一天开板的股票数量大于1的股票

6.找到同一天开板的股票数量大于1的股票

5
1
# 找到同一天开板的股票数量大于1的股票
2
3
day_count = new_equity.groupby('un_limit_day').size()
4
more_than_one_stock_unlimit = day_count[day_count>1].index # 当天不止一只股票开板的日期
5
new_equity = new_equity[new_equity['un_limit_day'].isin(more_than_one_stock_unlimit)]
查看全部

7. 找到牛熊分界处于熊市一侧的股票

股社区觉得可以替换为399678低于20日线,这个是深次新股指数。这里面要用到优矿的指数因子的API,相当方便啊

7. 找到牛熊分界处于熊市一侧的股票

股社区觉得可以替换为399678低于20日线,这个是深次新股指数。这里面要用到优矿的指数因子的API,相当方便啊

10
1
def get_bear_flag(day):
2
   '''判断是否是熊市一侧,如果399678低于20日线,即可简单认为是熊市'''
3
   day = day.replace('-','')
4
   df = DataAPI.MktIdxFactorOneDayGet(tradeDate=day,secID=u'',ticker=u'399678',field=u'Close,MA20',pandas='1')
5
   if len(df[df['Close'] df['MA20']])>0:
6
       return True
7
   return False
8
9
new_equity['is_bear'] = new_equity.apply(lambda x:get_bear_flag(x['un_limit_day']), axis=1)
10
new_equity = new_equity[new_equity['is_bear']]
查看全部

8. 分析超额收益

经过上面几步的筛选,已经得到我们需要的股票池。按照研报的中思路,我们在开板后买入,持有20天,相较于中证500,有24.3%的超额收益!

8. 分析超额收益

经过上面几步的筛选,已经得到我们需要的股票池。按照研报的中思路,我们在开板后买入,持有20天,相较于中证500,有24.3%的超额收益!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
巴菲特研习社|2013年巴菲特致股东的信 Day2
Morningstar Equity Analyst 必读书单
Backtrader量化平台教程
python量化之路:获取历史某一时刻沪深上市公司股票代码及上市时间
如何用Python中Tushare包轻松完成股票筛选(详细流程操作)
策略常用函数库
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服