如果市场有多个符合这个条件的可转债,可以进行排序,选择排名靠前的几个进行购买,类似于选债策略。
代码如下:
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%左右就停了。
什么人赚什么钱,只能说我目前不适合玩可转债。但我会把研究期间的一些心得和代码分享出来,喜欢玩可转债的大家可以把我的代码拿去改改归为己用。