这一教程我们来探索利用 xalpha 提供的工具来计算可转债定价

In [5]:
import xalpha as xa
import pandas as pd
import numpy as np

xa.set_display("notebook")

我们的对比基准是富投网提供的可转债数据, 其具有详细的可转债定价数据

In [2]:
df = xa.misc.get_ri_status()
df
Out[2]:

xalpha 提供的转债价格计算器债券价值部分估算是非常好的,期权部分只采用了简单的 BS 公式估算 call 价值,其他部分都省略,让我们看下这样的前提下的估值效果和富投网以及市场情况差多少。

In [9]:
# 首先我们看下 xalpha 的可转债计算器怎么用
c = xa.CBCalculator("SH113575")
c.analyse()
Out[9]:
{'bond_value': 92.10326407496153,
 'bondrate': 0.036832,
 'cbcode': 'SH113575',
 'cbprice': 112.56,
 'date': '2020-05-17',
 'enddate': '2026-04-08',
 'historical_valatility': 0.3943500675205567,
 'interest': [0.4, 0.6, 1.0, 1.5, 2.0, 2.3, 105.7],
 'issuedate': '2020-04-08',
 'name': '东时转债',
 'option_value': 24.42487275792871,
 'predicted_volatility': 0.19,
 'premium': -3.405303595114395,
 'rating': 'AA',
 'riskfreerate': 0.019702,
 'stockcode': 'SH603377',
 'stockprice': 15.01,
 'tot_value': 116.52813683289024,
 'years': 5.8931506849315065,
 'ytm_wi_tax': -0.0009515432823119259,
 'ytm_wo_tax': 0.0014396299788003476,
 'zgj': 14.76}

没错用起来就是这么简单,所有的无风险利率,波动率,不同信用等级和久期对应的债券利率等细节都自动处理好了。 你还可以了解历史任意一天的可转债价值情况。不过值得提醒的是,暂时引擎未处理可转债转股价调整信息,总是利用现在的转股价估值,可能会带入未来数据。

In [10]:
c.analyse("2020-05-01")
Out[10]:
{'bond_value': 93.18697238786118,
 'bondrate': 0.034732,
 'cbcode': 'SH113575',
 'cbprice': 117.45,
 'date': '2020-05-01',
 'enddate': '2026-04-08',
 'historical_valatility': 0.3928622592240376,
 'interest': [0.4, 0.6, 1.0, 1.5, 2.0, 2.3, 105.7],
 'issuedate': '2020-04-08',
 'name': '东时转债',
 'option_value': 27.92990803084096,
 'predicted_volatility': 0.19,
 'premium': -3.0275552061989175,
 'rating': 'AA',
 'riskfreerate': 0.017886,
 'stockcode': 'SH603377',
 'stockprice': 15.82,
 'tot_value': 121.11688041870214,
 'years': 5.93972602739726,
 'ytm_wi_tax': -0.008246198442578546,
 'ytm_wo_tax': -0.005899073653703114,
 'zgj': 14.76}
In [3]:
df["bvalue"] = 0
df["ovalue"] = 0
df["tvalue"] = 0
df["votality"] = 0
df["rate"] = 0
for i, r in df.iterrows():
    code = xa.universal.ttjjcode(r["转债代码"])
    c = xa.CBCalculator(code)
    d = c.analyse()
    df.loc[i, "bvalue"] = d["bond_value"]
    df.loc[i, "ovalue"] = d["option_value"]
    df.loc[i, "tvalue"] = d["tot_value"]
    df.loc[i, "votality"] = d["predicted_volatility"]
    df.loc[i, "rate"] = d["bondrate"]
the format of rlist must contain the final return more than 100 without interest of that year
the format of rlist must contain the final return more than 100 without interest of that year
the format of rlist must contain the final return more than 100 without interest of that year
In [10]:
df["ridiff"] = pd.to_numeric(df["内在价值"]) - pd.to_numeric(df["转债价格"])
np.std(sorted(df["ridiff"])[10:-10]), np.mean(sorted(df["ridiff"])[10:-10])
# 富投估值和市价比较
Out[10]:
(6.981658410811314, -2.9449737991266383)
In [11]:
df["ridiff"] = pd.to_numeric(df["tvalue"]) - pd.to_numeric(df["转债价格"])
np.std(sorted(df["ridiff"])[10:-10]), np.mean(sorted(df["ridiff"])[10:-10])
# xa估值和市价比较, 实践证明简单的期权估值一样能得到不错的效果,整体估值略微偏低,这是因为没考虑其他几个期权要素的贡献
Out[11]:
(7.38055079710973, -3.128113244642439)
In [12]:
df["ridiff"] = pd.to_numeric(df["tvalue"]) - pd.to_numeric(df["内在价值"])
np.std(sorted(df["ridiff"])[10:-10]), np.mean(sorted(df["ridiff"])[10:-10])
# xa 估值和富投估值的比较, 平均水平下估值几乎一致,xa 的估值系统完全可用
Out[12]:
(2.4782227297597, 0.08819892306550775)
In [13]:
# 总体表格供参考,英文项目来自 xa 估值,中文项目来自富投
df
Out[13]:
In [ ]: