宁稳网可转债弹性因子 python回测

李魔佛 发表了文章 • 0 个评论 • 75 次浏览 • 2022-12-04 18:43 • 来自相关话题

利用文章: 
https://t.zsxq.com/08779XPlk

的数据和代码,修改原来的代码
 df=df.sort_values('税前收益率',ascending=False)
改为
df=df.sort_values('弹性',ascending=False) # 倒序


df=df.sort_values('弹性',ascending=True) # 正序
还有这里:
 df = pd.read_excel(full_path)

df['税前收益率'] = df['税前收益率'].map(convert_float)
df['转股价格']=df['转股价格'].astype(float)
df=df[['转债代码','转债名称','转债价格','税前收益率']]

改为:

df['弹性'] = df['弹性'].map(convert_float)
df['转股价格']=df['转股价格'].astype(float)
df=df[['转债代码','转债名称','转债价格','弹性']]
如果修改持有个数,天数,修改HOLD_NUM ,和FREQ 即可

得到下面的图:
 




点击查看大图
 
"1天,大到小" 收益率 -30%,最大回撤34%

"1天,小到大" 收益率15.74%,最大回撤10.43%

'5天,大到小' 收益率-25%,最大回撤30.71%

'5天,小到大' 收益率7.36%, 最大回撤10.47%


可见弹性按照单天弹性值排名,买入最大的10只,无论按1天还是5天轮动,今天收益率是亏损的;

可见弹性按照单天弹性值排名,买入最小的10只,无论按1天还是5天轮动,今天收益率是盈利的;
 
如果对数据有疑问,可以到公众号后台留言~ 查看全部
利用文章: 
https://t.zsxq.com/08779XPlk

的数据和代码,修改原来的代码
 
df=df.sort_values('税前收益率',ascending=False)
改为
df=df.sort_values('弹性',ascending=False) # 倒序


df=df.sort_values('弹性',ascending=True) # 正序

还有这里:
 
df = pd.read_excel(full_path)

df['税前收益率'] = df['税前收益率'].map(convert_float)
df['转股价格']=df['转股价格'].astype(float)
df=df[['转债代码','转债名称','转债价格','税前收益率']]

改为:

df['弹性'] = df['弹性'].map(convert_float)
df['转股价格']=df['转股价格'].astype(float)
df=df[['转债代码','转债名称','转债价格','弹性']]

如果修改持有个数,天数,修改HOLD_NUM ,和FREQ 即可

得到下面的图:
 

20221204003-name.jpg
点击查看大图
 
"1天,大到小" 收益率 -30%,最大回撤34%

"1天,小到大" 收益率15.74%,最大回撤10.43%

'5天,大到小' 收益率-25%,最大回撤30.71%

'5天,小到大' 收益率7.36%, 最大回撤10.47%


可见弹性按照单天弹性值排名,买入最大的10只,无论按1天还是5天轮动,今天收益率是亏损的;

可见弹性按照单天弹性值排名,买入最小的10只,无论按1天还是5天轮动,今天收益率是盈利的;
 
如果对数据有疑问,可以到公众号后台留言~

可转债到期收益率因子回测 YTM回测 vs 双低 低溢价 低价策略

李魔佛 发表了文章 • 0 个评论 • 104 次浏览 • 2022-11-26 16:51 • 来自相关话题

最近看到有人发的一些可转债高YTM的回测结果图,说高YTM轮动收益达到年化20%。嗯?高TYM实际上大部分是和低价转债是重叠的,理论和实际收益率都应该不会有这么高的。

自从优矿转为收费后,基本就没有登录过了。现在的回测在本地进行了,宁稳网的可转债数据上有YTM这因子数据,所以这次使用宁稳网的数据回测。也不使用什么第三方框架了,直接手写回测,模拟交易过程。
 
逻辑就是按照交易日期,读取所有excel数据。保存到一个dataframe里面,然后按照日期对YTM排名。 选出排名N名的进行买入,掉出N名的进行卖出。
 
数据源
 
采用宁稳的全表数据,里面有YTM因子





 





 
YTM收益率曲线
本地使用python编写回测代码,纯手工,不使用第三方框架。 平时我也多次力荐大家手写,别依赖那些第三方框架,什么vnpy,backtrade,一是特别难用,数据要适配,二是不好调试,除非你对它们的源码特别熟悉。本回测代码和宁稳数据放在个人知识星球,大部分人其实只关心回测结果就够了。

下图是2022年1月1日至11月25日的回测数据。持有10个标的,红色的是1天调仓,蓝色的是5天调仓
 





 
5天轮动,2022年的收益率为4.29%,最大回撤6.98% 。

1天轮动,2022年的收益率为9.33%,最大回撤5.32% 。

1天轮动的整体收益率要比5天轮动的高5个点,并且最大回撤也小一点。

持仓日志
 






从持仓以及调仓日志来看,买入的大部分是低价转债,且部分也是之前有瑕疵,爆过雷的转债。
 
高YTM轮动 vs 双低,低溢价,低价

接着对比一下几个常规的转债策略,双低,低溢价,低价。

回测条件相同,起始时间2022-01-01,结束时间2022-11-25。

持有10只,5天轮动。
 





 
在今年的可转债偏弱的行情下,高YTM轮动在这4个策略里面的收益率是最高的。

低溢价一如既然的高波动,一会ICU,一会蹦迪。但笔者觉得跌到前期最大回撤的位置,低溢价可以考虑介入的。
 





 
YTM和低价格的今年回测收益率接近,YTM高了一个点左右,最大回撤接近。 而低溢价还在回撤的途中,目前今年的收益率为-25%,如果轮动频率高一些,低溢价收益率会高一些,强赎的转债基本会被轮入低溢价标的,因为最近半年强赎后的转债像进入了死亡螺旋一样,正股转债一起跌;因此排除强赎转债会对低溢价收益率有不少的提升。
 
完整代码以及数据请开通星球查收。




 
 
 
 
  查看全部
最近看到有人发的一些可转债高YTM的回测结果图,说高YTM轮动收益达到年化20%。嗯?高TYM实际上大部分是和低价转债是重叠的,理论和实际收益率都应该不会有这么高的。

自从优矿转为收费后,基本就没有登录过了。现在的回测在本地进行了,宁稳网的可转债数据上有YTM这因子数据,所以这次使用宁稳网的数据回测。也不使用什么第三方框架了,直接手写回测,模拟交易过程。
 
逻辑就是按照交易日期,读取所有excel数据。保存到一个dataframe里面,然后按照日期对YTM排名。 选出排名N名的进行买入,掉出N名的进行卖出。
 
数据源
 
采用宁稳的全表数据,里面有YTM因子

20221126001.jpg

 
20221126002.jpg


 
YTM收益率曲线
本地使用python编写回测代码,纯手工,不使用第三方框架。 平时我也多次力荐大家手写,别依赖那些第三方框架,什么vnpy,backtrade,一是特别难用,数据要适配,二是不好调试,除非你对它们的源码特别熟悉。本回测代码和宁稳数据放在个人知识星球,大部分人其实只关心回测结果就够了。

下图是2022年1月1日至11月25日的回测数据。持有10个标的,红色的是1天调仓,蓝色的是5天调仓
 

20221126006.jpg

 
5天轮动,2022年的收益率为4.29%,最大回撤6.98% 。

1天轮动,2022年的收益率为9.33%,最大回撤5.32% 。

1天轮动的整体收益率要比5天轮动的高5个点,并且最大回撤也小一点。

持仓日志
 

20221126009.jpg


从持仓以及调仓日志来看,买入的大部分是低价转债,且部分也是之前有瑕疵,爆过雷的转债。
 
高YTM轮动 vs 双低,低溢价,低价

接着对比一下几个常规的转债策略,双低,低溢价,低价。

回测条件相同,起始时间2022-01-01,结束时间2022-11-25。

持有10只,5天轮动。
 

20221126005.jpg

 
在今年的可转债偏弱的行情下,高YTM轮动在这4个策略里面的收益率是最高的。

低溢价一如既然的高波动,一会ICU,一会蹦迪。但笔者觉得跌到前期最大回撤的位置,低溢价可以考虑介入的。
 

20221126010.jpg

 
YTM和低价格的今年回测收益率接近,YTM高了一个点左右,最大回撤接近。 而低溢价还在回撤的途中,目前今年的收益率为-25%,如果轮动频率高一些,低溢价收益率会高一些,强赎的转债基本会被轮入低溢价标的,因为最近半年强赎后的转债像进入了死亡螺旋一样,正股转债一起跌;因此排除强赎转债会对低溢价收益率有不少的提升。
 
完整代码以及数据请开通星球查收。
f088492c7da0ce8b90cbdb7aafe3b191.png

 
 
 
 
 

可转债 最新的不下修转股价 名单 持续更新

李魔佛 发表了文章 • 0 个评论 • 308 次浏览 • 2022-09-28 11:24 • 来自相关话题

已公布不下修转股价的可转债列表汇总
 
数据更新至2022年9月24日。

如果可转债公布了某个时间段内的不下修转股价,在溢价率很高的情况下,那么在该时间段内,其溢价率回归的办法只剩拉正股了,而在这上涨阶段中,站在概率面,持有转债的涨幅是会大幅低于正股的。

现在市场的情况也是这样,如果可转债公布不下修,第二天的开盘会以低开反映出来。

数据来源:巨潮。

文末附获取原始数据方法。
 



点击查看大图





点击查看大图





点击查看大图
 

链接: https://pan.baidu.com/s/1TVAR3nftALTWR0VTnagVhg 提取码: 5wde
更多公众号文章代码与数据,可输入:帮助
 

  查看全部
已公布不下修转股价的可转债列表汇总
 
数据更新至2022年9月24日。

如果可转债公布了某个时间段内的不下修转股价,在溢价率很高的情况下,那么在该时间段内,其溢价率回归的办法只剩拉正股了,而在这上涨阶段中,站在概率面,持有转债的涨幅是会大幅低于正股的。

现在市场的情况也是这样,如果可转债公布不下修,第二天的开盘会以低开反映出来。

数据来源:巨潮。

文末附获取原始数据方法。
 
t1.jpeg
点击查看大图


t2.jpeg
点击查看大图


t3.jpeg
点击查看大图
 

链接: https://pan.baidu.com/s/1TVAR3nftALTWR0VTnagVhg 提取码: 5wde
更多公众号文章代码与数据,可输入:帮助
 

 

ptrade回测和实盘支持可转债日内tick/分时吗?

李魔佛 发表了文章 • 0 个评论 • 605 次浏览 • 2022-07-25 07:19 • 来自相关话题

是支持的。
 
比如下面的部分代码片段,是用于导出可转债的日内分时数据的。最低颗粒,按照一分钟k线获取。 ptrade里面能够获取到的最小频率单位。
 def initialize(context):
# 初始化策略
g.code_mapper = date_code_mapper()
log.info(g.code_mapper)
g.error_set=set()

def last_n_day(date,n,origin_fmt,target_fmt):
return (datetime.datetime.strptime(date, origin_fmt) - datetime.timedelta(days=n)).strftime(target_fmt)

def post_fix(code):
return code + '.SZ' if code.startswith('12') else code + '.SS'

def handle_data(context, data):
date=context.blotter.current_dt.strftime('%Y%m%d')
if date not in g.code_mapper:
return

security_list=g.code_mapper.get(date)

for code in security_list:
code=post_fix(code)
try:
df = get_history(1, frequency='1m', field=['open' ,'high','low','close'], security_list=code, fq='pre',include=False)
except Exception as e:
if code not in g.error_set:
log.info(e)
log.info('代码获取数据 出错{}'.format(code))
g.error_set.add(code)
continue
df['ticker']=code
g.result.append(df)

def after_trading_end(context, data):
#engine = DBS
db = DBSelector()
conn = db.get_engine()
date=context.blotter.current_dt.strftime('%Y%m%d%H%M')
if len(g.result)==0:
return

df = pd.concat(g.result)
try:
df.to_sql('minute_info',con=conn,if_exists='append')
except Exception as e:
log.info(e)

g.result=

def before_trading_start(context, data):
g.result=
然后在handle_data里面加入相关的order就可以交易了。(上面的代码主要是保存tick/分时数据到mysql,实际并没有进行交易。) 查看全部
是支持的。
 
比如下面的部分代码片段,是用于导出可转债的日内分时数据的。最低颗粒,按照一分钟k线获取。 ptrade里面能够获取到的最小频率单位。
 
def initialize(context):
# 初始化策略
g.code_mapper = date_code_mapper()
log.info(g.code_mapper)
g.error_set=set()

def last_n_day(date,n,origin_fmt,target_fmt):
return (datetime.datetime.strptime(date, origin_fmt) - datetime.timedelta(days=n)).strftime(target_fmt)

def post_fix(code):
return code + '.SZ' if code.startswith('12') else code + '.SS'

def handle_data(context, data):
date=context.blotter.current_dt.strftime('%Y%m%d')
if date not in g.code_mapper:
return

security_list=g.code_mapper.get(date)

for code in security_list:
code=post_fix(code)
try:
df = get_history(1, frequency='1m', field=['open' ,'high','low','close'], security_list=code, fq='pre',include=False)
except Exception as e:
if code not in g.error_set:
log.info(e)
log.info('代码获取数据 出错{}'.format(code))
g.error_set.add(code)
continue
df['ticker']=code
g.result.append(df)

def after_trading_end(context, data):
#engine = DBS
db = DBSelector()
conn = db.get_engine()
date=context.blotter.current_dt.strftime('%Y%m%d%H%M')
if len(g.result)==0:
return

df = pd.concat(g.result)
try:
df.to_sql('minute_info',con=conn,if_exists='append')
except Exception as e:
log.info(e)

g.result=

def before_trading_start(context, data):
g.result=

然后在handle_data里面加入相关的order就可以交易了。(上面的代码主要是保存tick/分时数据到mysql,实际并没有进行交易。)

获取可转债历史分时tick数据 【python】

李魔佛 发表了文章 • 0 个评论 • 1126 次浏览 • 2022-06-25 12:29 • 来自相关话题

可转债的历史分时tick数据,基本在很多大平台,优矿,聚宽,米宽等平台都没有提供。
 
对于想做日内回测的朋友,是一件很痛苦的事情。
 
那么,接下来,本文结束一种通过第三方平台的数据,来把可转债的分时tick数据获取下来,并保存到本地数据库。
 





 
2022-07-05 更新:

如果直接拿历史数据,可以拿到1分钟级别的数据,如上图所示。
 
如果要拿秒级别的,需要实时采集。
 
笔者使用sqlite做为内存缓存,盘后统一入到mysql中。






如果盘中每隔3秒使用mysql储存,显然会造成不必要的io阻塞(开个线程存数据也是一个方案)。
 
使用sqlite的时候,设置为memeory模式,速度比存文件要快很多倍。
 
 
待续 查看全部
可转债的历史分时tick数据,基本在很多大平台,优矿,聚宽,米宽等平台都没有提供。
 
对于想做日内回测的朋友,是一件很痛苦的事情。
 
那么,接下来,本文结束一种通过第三方平台的数据,来把可转债的分时tick数据获取下来,并保存到本地数据库。
 

20220625001.png

 
2022-07-05 更新:

如果直接拿历史数据,可以拿到1分钟级别的数据,如上图所示。
 
如果要拿秒级别的,需要实时采集。
 
笔者使用sqlite做为内存缓存,盘后统一入到mysql中。

20220705002.png


如果盘中每隔3秒使用mysql储存,显然会造成不必要的io阻塞(开个线程存数据也是一个方案)。
 
使用sqlite的时候,设置为memeory模式,速度比存文件要快很多倍。
 
 
待续

强赎日期计数 excel文件

李魔佛 发表了文章 • 0 个评论 • 690 次浏览 • 2022-06-04 22:54 • 来自相关话题

 
代码 名称 当前满足天数 强赎目标数 周期 以公告
113568 新春转债 已公告强赎
127043 川恒转债 暂不强赎
123086 海兰转债 暂不强赎
113548 石英转债 暂不强赎
128107 交科转债 已公告强赎
110071 湖盐转债 12 15 30
128111 中矿转债 暂不强赎
127013 创维转债 14 15 30
123092 天壕转债 暂不强赎
128046 利尔转债 19 20 30
127027 靖远转债 暂不强赎
113541 荣晟转债 公告要强赎
123085 万顺转2 暂不强赎
123083 朗新转债 12 15 30
128128 齐翔转2 暂不强赎
128106 华统转债 暂不强赎
113537 文灿转债 暂不强赎
128095 恩捷转债 已满足强赎条件
127007 湖广转债 暂不强赎
123012 万顺转债 暂不强赎
123057 美联转债 暂不强赎
113585 寿仙转债 暂不强赎
110061 川投转债 暂不强赎
113626 伯特转债 暂不强赎
113025 明泰转债 暂不强赎
123078 飞凯转债 暂不强赎
113567 君禾转债 暂不强赎
128017 金禾转债 暂不强赎
128040 华通转债 暂不强赎
128029 太阳转债 暂不强赎
123073 同和转债 暂不强赎
110055 伊力转债 暂不强赎
113525 台华转债 暂不强赎
123060 苏试转债 暂不强赎
127038 国微转债 暂不强赎
123046 天铁转债 暂不强赎
123098 一品转债 暂不强赎
110074 精达转债 暂不强赎
123114 三角转债 暂不强赎
113051 节能转债 暂不强赎
128140 润建转债 暂不强赎
123071 天能转债 暂不强赎
113027 华钰转债 暂不强赎
128091 新天转债 暂不强赎
128085 鸿达转债 暂不强赎
113620 傲农转债 暂不强赎
123052 飞鹿转债 暂不强赎
118000 嘉元转债 暂不强赎
128082 华锋转债 暂不强赎
128109 楚江转债 暂不强赎
113016 小康转债 暂不强赎
123027 蓝晓转债 暂不强赎
128137 洁美转债 暂不强赎
128101 联创转债 暂不强赎
123031 晶瑞转债 暂不强赎
128078 太极转债 暂不强赎
128030 天康转债 暂不强赎
123034 通光转债 暂不强赎
 
excel原文件:
http://xximg.30daydo.com/webupload/2022-06-04-redeem-info.xlsx
 
或者关注公众号:可转债量化分析
 
后台回复:
强赎20220604 查看全部
20220604003.png


20220604004.png

 
代码 名称 当前满足天数 强赎目标数 周期 以公告
113568 新春转债 已公告强赎
127043 川恒转债 暂不强赎
123086 海兰转债 暂不强赎
113548 石英转债 暂不强赎
128107 交科转债 已公告强赎
110071 湖盐转债 12 15 30
128111 中矿转债 暂不强赎
127013 创维转债 14 15 30
123092 天壕转债 暂不强赎
128046 利尔转债 19 20 30
127027 靖远转债 暂不强赎
113541 荣晟转债 公告要强赎
123085 万顺转2 暂不强赎
123083 朗新转债 12 15 30
128128 齐翔转2 暂不强赎
128106 华统转债 暂不强赎
113537 文灿转债 暂不强赎
128095 恩捷转债 已满足强赎条件
127007 湖广转债 暂不强赎
123012 万顺转债 暂不强赎
123057 美联转债 暂不强赎
113585 寿仙转债 暂不强赎
110061 川投转债 暂不强赎
113626 伯特转债 暂不强赎
113025 明泰转债 暂不强赎
123078 飞凯转债 暂不强赎
113567 君禾转债 暂不强赎
128017 金禾转债 暂不强赎
128040 华通转债 暂不强赎
128029 太阳转债 暂不强赎
123073 同和转债 暂不强赎
110055 伊力转债 暂不强赎
113525 台华转债 暂不强赎
123060 苏试转债 暂不强赎
127038 国微转债 暂不强赎
123046 天铁转债 暂不强赎
123098 一品转债 暂不强赎
110074 精达转债 暂不强赎
123114 三角转债 暂不强赎
113051 节能转债 暂不强赎
128140 润建转债 暂不强赎
123071 天能转债 暂不强赎
113027 华钰转债 暂不强赎
128091 新天转债 暂不强赎
128085 鸿达转债 暂不强赎
113620 傲农转债 暂不强赎
123052 飞鹿转债 暂不强赎
118000 嘉元转债 暂不强赎
128082 华锋转债 暂不强赎
128109 楚江转债 暂不强赎
113016 小康转债 暂不强赎
123027 蓝晓转债 暂不强赎
128137 洁美转债 暂不强赎
128101 联创转债 暂不强赎
123031 晶瑞转债 暂不强赎
128078 太极转债 暂不强赎
128030 天康转债 暂不强赎
123034 通光转债 暂不强赎
 
excel原文件:
http://xximg.30daydo.com/webupload/2022-06-04-redeem-info.xlsx
 
或者关注公众号:可转债量化分析
 
后台回复:
强赎20220604

敬畏市场 市场里没有永恒的圣杯

绫波丽 发表了文章 • 0 个评论 • 1301 次浏览 • 2021-08-27 19:59 • 来自相关话题

无论回测,还是最近的实际盈利。可转债低溢价策略最近风头还是很猛的
 
实际上发力时间是在6月中旬
无论回测,还是最近的实际盈利。可转债低溢价策略最近风头还是很猛的
 
实际上发力时间是在6月中旬