【股票量化精华帖_策略33篇】买入正股涨停的可转债

发布于: 雪球转发:0回复:0喜欢:0

有时候股票涨停以后,如果你觉得它未来还会有涨幅溢价,你想参与进去,却因封单太大无法买入。这时候,你可以看看这只股票是否有可转债,考虑参与其可转债,正股涨通常也会带动可转债涨,往往因为可准债没有涨跌停限制(好像已经有限制了,不过还是很刺激),其涨幅远超正股。

这里提供一个买入正股涨停的可转债选股函数。当判断正股涨停时,买入其对应的可转债。
如果市场有多个符合这个条件的可转债,可以进行排序,选择排名靠前的几个进行购买,类似于选债策略。

代码如下:

def randomnew(n=13):

"""

创建一个n位的随机整数

:param n:

:return:

"""

start = 10**(n-1)

end = (10**n)-1

return str(randint(start, end))

def get_kzz_from_jjl():

"""

从集思录获取可转债的实时信息

返回的信息只是源数据的一部分

可以按需增加减少。

到期时间按强赎时间为准

:return:

"""

# ===构建url

url = '网页链接

url = url % (randomnew(n=13))

# ===获取数据

content = get_content_from_internet(url)

content = json.loads(content)

k_data = content['rows']

for i in range(len(k_data)):

k_data[i] = k_data[i]['cell']

df = pd.DataFrame(k_data)

rename_dict = {'bond_nm': '转债名称', 'bond_id': '转债交易代码', 'price': '转债现价', 'increase_rt': '转债涨跌幅', 'rating_cd': '评级',

'stock_nm': '正股名称', 'sprice': '正股现价', 'sincrease_rt': '正股涨跌幅', 'stock_net_value': '正股净资产',

'pb': '市净率', 'convert_price': '最新转股价', 'convert_value': '转股价值', 'premium_rt': '溢价率',

'fund_rt': '机构持仓', 'convert_amt_ratio': '转债占比', 'force_redeem_price': '强赎触发价',

'put_convert_price': '回售触发价',

'short_maturity_dt': '到期时间', 'year_left': '剩余年限', 'dblow': '双低', 'last_time': '最后更新',

'stock_id': '正股股票代码', 'stock_cd': '正股交易代码', 'pre_bond_id': '转债股票代码', 'convert_cd': '转股代码',

'price_tips': '价格提示', 'svolume': '正股成交额', 'force_redeem': '强赎情况', }

df.rename(columns=rename_dict, inplace=True)

# '强赎情况'可知是否有提前赎回,'价格提示'可知是否未上市,'转股代码'可知是否能转股

df = df[['转债名称', '转债交易代码', '转债股票代码', '转债现价', '转债涨跌幅', '正股名称', '正股交易代码',

'正股股票代码', '正股现价', '正股涨跌幅', '溢价率', '到期时间', '强赎情况', '价格提示', '转股代码', '双低', '最后更新']]

df = df[df['转债名称'].str.contains('EB') == False] # 排除可交换债

df['强赎情况'].fillna(value=df['到期时间'], inplace=True)

df['强赎情况'] = df['强赎情况'].str.replace('最后交易日:', '')

df['强赎情况'] = df['强赎情况'].str.replace('年', '/')

df['强赎情况'] = df['强赎情况'].str.replace('月', '/')

df['强赎情况'] = df['强赎情况'].str.replace('日', '//')

df['强赎情况'].str.strip()

df['强赎情况'] = df['强赎情况'].str[:10]

df.loc[df['强赎情况'].str.contains('-'), '强赎情况'] = None

df['强赎情况'] = pd.to_datetime(df['强赎情况'])

df['强赎情况'] = df['强赎情况'].astype(str)

df['强赎情况'] = df['强赎情况'].str[:10]

return df

def select_gydb_kzz(select_stock_num=3):

"""

用于挑选能隔夜打板的可转债

正股涨停,溢价率暂时不考虑。

:param select_stock_num:

:return:

"""

# 集思录抓取可转债数据

df0 = get_kzz_from_jjl()

# 第一步:初步筛选可转债。

now = str(datetime.now())[2:10]

tomorrow_time = datetime.now() + timedelta(days=1)

tomorrow = str(tomorrow_time)[2:10]

now2 = str(datetime.now())[0:10]

tomorrow2 = str(tomorrow_time)[0:10]

# 把赎回时间为今天和明天的可转债排除

df0 = df0[df0['到期时间'] != tomorrow]

df0 = df0[df0['到期时间'] != now]

df0 = df0[df0['强赎情况'] != tomorrow2]

df0 = df0[df0['强赎情况'] != now2]

# 删除停牌的

df0 = df0[df0['转债涨跌幅'].str.contains('停牌') == False]

df0 = df0[df0['正股涨跌幅'].str.contains('停牌') == False]

# '转债涨跌幅''正股涨跌幅''溢价率'这三个把百分号去掉了,方便转为数字格式

df0['转债涨跌幅'] = df0['转债涨跌幅'].str.strip('%')

df0['正股涨跌幅'] = df0['正股涨跌幅'].str.strip('%')

df0['溢价率'] = df0['溢价率'].str.strip('%')

df0[['转债现价', '正股现价', '双低', '转债涨跌幅', '正股涨跌幅', '溢价率']] = df0[['转债现价', '正股现价', '双低', '转债涨跌幅', '正股涨跌幅', '溢价率']].astype(

float)

# 把溢价大的删除,进一步降低风险

# yyl = max(100, df0['溢价率'].median(), df0['溢价率'].mean()) # 任意设置最大溢价率,这里我设置的三种溢价率中的较大值作为选债的最大溢价率。

# print('选取最大溢价率:', yyl)

# df0 = df0[df0['溢价率'] < yyl]

# 第二步:获取涨停的可转债

df0 = df0[df0['正股涨跌幅'] > 9.9]

df0 = df0[df0['转债涨跌幅'] > 0] # 转债也是涨的,双保险。

kzz_list = list(df0['正股股票代码'])

if len(kzz_list) > 0:

latest_df = get_today_data_from_sinajs(code_list=kzz_list) # 为了获取买1价防止有开盘涨停的

latest_df['涨停价格'] = latest_df['前收盘价'] * 1.1

latest_df['涨停价格'] = latest_df['涨停价格'].apply(

lambda x: float(Decimal(x * 100).quantize(Decimal('1'), rounding=ROUND_HALF_UP) / 100))

df0.reset_index(drop=True, inplace=True)

latest_df.reset_index(drop=True, inplace=True)

df0['涨停价格'] = latest_df['涨停价格']

# 为什么不用正股现价,而是用buy1,因为怕现价是卖一价,那么就不是涨停

df0['buy1'] = latest_df['buy1']

df0 = df0[df0['涨停价格'] == df0['buy1']]

# 对符合条件的可转债进行排序(我用溢价率)

df0.sort_values(by=['溢价率'], ascending=1, inplace=True)

df0 = df0[:select_stock_num]

print(df0)

dingding_robot_id = '11c3eb760fab057d2039d035c9024bce116a7e1196bf789878455dae36493614' # 钉钉id

dd_msg = '隔夜打板选债结果:\n%s\n' % str(df0[['转债名称', '转债股票代码']])

send_dingding(dd_msg, robot_id=dingding_robot_id)

# 购买列表

buy_list = list(df0['转债股票代码'])

else:

buy_list = []

return buy_list

讲解一下:
1、函数对强赎情况进行了处理,因为集思录的强赎情况是文字描述,很难用统一的格式把其中的时间摘出来,有时候网站一变格式就会报错。所以我建议可以把对强赎的处理删除,想办法手动排除未来1-2天可能被强赎的可转债,可转债一旦被强赎,基本都是损失惨重。

2、溢价率高于多少的可转债不选这条规则我注释掉了,但我保留了代码,大家可以自行选择。因为实践中经常是溢价率都高的不得了的可转债反而涨的特别好,大家可以根据自己的风险情况选择要不要排除溢价率高的。

3、我设置的是正股涨停的时候,转债也是涨的才可以,双保险,防止正股涨转债不涨的那种奇葩转债。

4、对符合条件的转债进行排序,选取一定数量的可转债。排序的规则我用的是按照溢价率由低到高,还可以按照转债现价进行排序,或者按照“双低”排序(也就是低价低溢价率)。

5、我目前没有可转债的实盘。之前做个一段时间,后来不玩了。一来我玩的时候正巧赶上市场对可转债疯涨的严查,几乎每周都会对涨的好的可转债进行通报,可以说是市场刻意打压可转债。二来再加上可转债的涨跌幅度较大,又是T+0,风险较大,需要时常盯盘,我一上班族没有这个精力。最后实盘损失了大概5%左右就停了。

什么人赚什么钱,只能说我目前不适合玩可转债。但我会把研究期间的一些心得和代码分享出来,喜欢玩可转债的大家可以把我的代码拿去改改归为己用。