基于Tushare的打新债可视化风险分析

最近的工作内容

回归了最本质最笨的工作方法,把工作任务写到笔记本(纸)上,然后对照着客户列表一个一个发送微信。。。提示打新

想了想为什么自己要如此笨拙的工作呢?之前学的什么RPA什么Seleium什么JS可视化还有没用啊

于是就有了今天的这个项目,是我花了一下午写好的,基于Python的tushare金融数据库,可以实现一定程度的可转债风险分析

理论何在?

  1. 转股溢价套利理论
  2. 可转债下修条款
  3. 金融心理学

如何实现

先上图,是在jupyter里面做的,是我的在线python终端哈哈,挂在服务器上哪里都能用,图上是瞎举例

困难点

  1. 获取前30交易日的日期

由于股市交易日一般在周一到周五,并且节假日也不开放,要获取向下修正股价的日期,需要前30个交易日的日期,获取今天日期很简单,但是获取前30交易日的话就要倒退,用到了chinese_calendar这个库

from chinese_calendar import is_holiday,is_workday
from datetime import datetime, date, timedelta

today = datetime.today()
yesterday = today + timedelta(days = -1)
# print(yesterday.strftime('%Y%m%d'))

# 往回倒推30日交易日
n = 0 
while n <29:
    if is_workday(yesterday):
        n = n + 1
    yesterday = yesterday + timedelta(days = -1)
last30day = yesterday.strftime('%Y%m%d')
# 前30日交易日的那一天
## print(last30day)
  1. 获得可转债和正股信息

因为可转债是tushare高级权限,要花钱,所以只能自己手动查询输入,毕竟每天发债都比较少,工作量还能接受

正股的信息是可以通过tushare直接获取的,得到30日收盘价,正股名称即可

  1. matplotlib.pyplot画图

plt不支持中文,自己google一下就能修好了

全局代码

import tushare as ts
from chinese_calendar import is_holiday,is_workday
from datetime import datetime, date, timedelta
import matplotlib.pyplot as plt

today = datetime.today()
yesterday = today + timedelta(days = -1)
# print(yesterday.strftime('%Y%m%d'))

# 往回倒推交易日
n = 0 
while n <29:
    if is_workday(yesterday):
        n = n + 1
    yesterday = yesterday + timedelta(days = -1)
last30day = yesterday.strftime('%Y%m%d')
# 前30日交易日的那一天
## print(last30day)

# tushare登陆
ts.set_token('自己填写密钥')
pro = ts.pro_api()

# 正股代码
stock_code = input('输入正股代码') # '002714.SZ'
# 转股价格
bond_exchange = float(input('输入转股价格')) #47.91
# 今日日期
today_simple = today.strftime('%Y%m%d') #210816
today = today.strftime('%Y-%m-%d') #21-08-16
# print(is_holiday(datetime.today()))

data = pro.query('stock_basic',ts_code=stock_code)
stock_name = data['name'][0]
df = pro.query('daily', ts_code=stock_code, start_date=last30day, end_date=today_simple)

# 正股当前价格
price = df['close'][0]
# 转股价值 
valueOfExchange = 100 / bond_exchange * price
# 溢价率
premiumRate = (100 - valueOfExchange)/valueOfExchange

bad = 0
loss = 0
close_price_array = []
for i in range(0,29):
    close_price_array.append(df['close'][i])
    if df['close'][i]< bond_exchange*0.85 :
        # 转股下修条款
        bad = bad + 1
    if df['close'][i]< bond_exchange:
        # 
        loss = loss + 1

# 开始画图
## 输入数据
x = df['trade_date']
y = df['close']
## 标题与图例
plt.xlabel('30 days')
plt.ylabel('close price')
plt.title("30 trade days price")
## 参考线
plt.axhline(y=bond_exchange*0.85, c="r", ls="--", lw=2)
plt.axhline(y=bond_exchange, c="g", ls="--", lw=2)

plt.gca().invert_xaxis()
## 
plt.plot(x,y,marker='o')
plt.xticks(rotation=90) # 横坐标每个值旋转90度
plt.show()

print('可转债分析报告:')
print(stock_name,stock_code,"转债当前溢价率",round(premiumRate*100,2),'%')
print(stock_name,stock_code,"近30个交易日低于转股价日期数:",loss)
print(stock_name,stock_code,"近30个交易日低于转股价85%日期数:",bad)
print('---------------------------------------------------------')
print("注释:绿线为债券转股价,红线为转股价85%,转股溢价率为负则存在套利机会")
print('正股蓝色点低于转股价绿线越多投资风险越高,因为一旦债券转股即会存在亏损')
print('正股蓝点低于转股价85%红线日期数越接近15,由于可下修转股价,债券价值会越高')

后期目标

web端实现本服务,并且用js来进行截图拼接操作

参考文章

  1. 本站Moechu最近做的理财相关代码项目