衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python-寫個可轉(zhuǎn)債分析器

汽車電子技術(shù) ? 來源:程序猿知秋 ? 作者:程序猿知秋 ? 2023-02-16 15:13 ? 次閱讀

業(yè)務(wù)需求分析

  • 根據(jù)輸入的可轉(zhuǎn)債代碼和 價格(可選) ,分析單個可轉(zhuǎn)債主要信息
  • 分析的主要字段是:
    • 基本信息: 代碼、名稱、現(xiàn)價、剩余年限、行業(yè)、溢價率
    • 已轉(zhuǎn)股比例: 此比例過高的話,大股東提升股價或下修轉(zhuǎn)股價的動力就弱
    • 到期價值: 贖回價+持有期未付利息之和*80%, 扣除了20%的稅
    • 到期收益率: 到期價值/當(dāng)前轉(zhuǎn)債價格-100%
    • 到期年化收益率: 到期收益率/剩余年限
    • 回售價值: [回售價+當(dāng)期的利息(按第四年算)] +持有到第四年所有未付利息之和*80%
    • 回售收益率: 回售價值/當(dāng)前轉(zhuǎn)債價格-100%
    • 回售年化收益率: 回售收益率/ 當(dāng)前持有到第四年的年限(如果小于1,則直接取回售收益率)
    • 股東質(zhì)押比例: 此值越高,代表公司越缺錢,將債主轉(zhuǎn)成股東的動力越大
    • 評級: 評級越高,違約的風(fēng)險越低
    • PB: 市值/凈資產(chǎn), PB越大,說明下修轉(zhuǎn)股價的空間越大
    • 發(fā)行規(guī)模: 此值越大說明盤子越大
    • 有無回售條款: 個別大公司,可能沒有,盡量買有回售的
    • 有無擔(dān)保: 有的話可減少違約風(fēng)險
    • 轉(zhuǎn)債占比:當(dāng)前剩余的可轉(zhuǎn)債占公司當(dāng)前流通市值的比值
    • 是否登記強(qiáng)贖 :如果登記了強(qiáng)贖,買之前應(yīng)仔細(xì)看強(qiáng)贖日期
  • 關(guān)于轉(zhuǎn)債利息部分,大部分轉(zhuǎn)債都是一年一付,且是按轉(zhuǎn)債發(fā)行日期開始計算,與持有人持有時間無關(guān),所以此處計算利息時,認(rèn)為超過1年,則按兩年利息計算

程序分析

程序依賴

  • 提供數(shù)據(jù)的網(wǎng)站(集思錄)、中登公司

  • **第三方庫依賴:requests、bs4、prettytable

    **

程序邏輯分析

  • 抓取所有可轉(zhuǎn)債列表,通過輸入的轉(zhuǎn)債代碼過濾出具體轉(zhuǎn)債
  • 根據(jù)轉(zhuǎn)債代碼,找到當(dāng)前轉(zhuǎn)債的 行業(yè)、已轉(zhuǎn)股比例、擔(dān)保情況、利息等信息
  • 在中登官網(wǎng)獲取該公司的質(zhì)押比例
  • 計算到期價值、到期收益率、到期年化收益率、回售價值、回售收益率、回售年化收益率
  • 格式化輸出所有關(guān)鍵字段信息

程序重要代碼

請求可轉(zhuǎn)債列表

def get_request(url):
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"
    }


    try:
        resp = requests.get(url, headers=header)
        resp.encoding = "utf-8"
        if resp.status_code == 200:
            return resp.text
        return None
    except Exception as e:
        print("http 請求失敗!!,", e)
        return None




def get_bonds_list(url):
    '''獲取可轉(zhuǎn)債列表'''
    resp = get_request(url)
    resp_json = json.loads(resp)
    datas = resp_json["rows"]
    if datas is None:
        return None


    return datas

查詢可轉(zhuǎn)債詳細(xì)信息

def get_bonds_detail(datas, bondCode):
    if datas == None or bondCode == None:
        print("請求參數(shù)為空,請檢查程序!!")
        return None


    result = None;
    for cell in datas:
        data=cell["cell"]
        bond_id = data["bond_id"]


        if bond_id == bondCode:
            result = data
            break
    else:
        print("沒有查詢到需要找的可轉(zhuǎn)債,請重新開始!!")
        print("*"*50)
        return None


    bondId = result["bond_id"]
    # 查詢債券詳細(xì)信息
    content = get_request("https://www.jisilu.cn/data/convert_bond_detail/%s" % bondId)
    if not content:
        print("查詢單個轉(zhuǎn)債信息失敗,bondId: %s" % bondId)
        return None


    # 解析行業(yè),已轉(zhuǎn)股比例等信息
    soup = BeautifulSoup(content, "html.parser")
    cvtRt = soup.find(id="cvt_rt").text
    if cvtRt is None:
        cvtRt = "-"
    result["cvt_rt"] = cvtRt


    indusity = soup.find(class_="jisilu_nav").select("a")[1].text
    if indusity is None:
        indusity = "-"
    result["indusity"] = indusity


    # 利息
    rate = soup.find(id="cpn_desc").text
    if rate is None:
        rate = "-"
    result["rate"] = rate


    # 到期贖回價
    redeem_price = soup.find(id="redeem_price").text
    if redeem_price is None:
        redeem_price = "-"
    result["redeem_price"] = redeem_price


    # 回售價
    put_price = soup.find(id="put_price").text
    if put_price is None:
        put_price = "-"
    result["put_price"] = put_price


    # 擔(dān)保
    guarantor = soup.find(id="guarantor").text
    if guarantor is None:
        guarantor = "-"
    result["guarantor"] = guarantor


    # 轉(zhuǎn)債占流通市值占比
    convert_amt_ratio = soup.find(id="convert_amt_ratio").text
    if convert_amt_ratio is None:
        convert_amt_ratio = "-"
    result["convert_amt_ratio"] = convert_amt_ratio


    # 查詢股東質(zhì)押率
    pledge = get_pledge(result["stock_cd"])
    result["pledge"] = pledge


    return result

通過中登公司管網(wǎng) 查詢股東質(zhì)押比例(質(zhì)押比例每周最后一個交易日才更新,當(dāng)前如果不是周六的話,就往前推6天,取上一周的)

def get_pledge(stock_cd):
    '''查詢股東質(zhì)押比例,暫時發(fā)現(xiàn)周日好像無法查詢'''
    # queryData = "2021.01.02"113035
    queryData = time.strftime("%Y.%m.%d", time.localtime())
    today = datetime.datetime.today().weekday() - 1
    if today!=6:
        today = datetime.date.today()- datetime.timedelta(days=6)
        queryData=today.strftime("%Y.%m.%d")


    content = get_request("http://www.chinaclear.cn/cms-rank/queryPledgeProportion?queryDate=%s&secCde=%s" % (
        queryData, stock_cd))
    soup = BeautifulSoup(content, "html.parser")
    frTmp = soup.find(class_="Stock Stock2")
    tdList = frTmp.find_all("td")
    pledge = tdList[-1].text
    if pledge is None:
        pledge = "-"
    else:
        pledge = pledge + "%"
    return pledge

計算投資價值及收益率

def calc_rate(data):
    '''計算收益率'''
    # 過濾利息
    newRateList = []
    rateList = data["rate"].split("%")
    # 將每年的利息過濾出來
    for r in rateList:
        newR = re.findall(r"\\d.\\d", r)
        if len(newR) > 0:
            newRateList.append(float(newR[0]))


    # 到期價值=到期贖回價+ 除最后一年外,所有未付利息之和*80%
    maturity = calc_maturity(newRateList, data["year_left"], data["redeem_price"])
    data["maturity"] = maturity


    # 到期收益率
    price = float(data["price"])
    priceDq = format((maturity - price)/price*100, ".2f")
    data["priceDq"] = priceDq + "%"


    # 到期年化收益率
    priceDqYear = format(float(priceDq) / float(data["year_left"]), ".2f")
    data["priceDqYear"] = priceDqYear + "%"


    # 回售價= 100+ 除最后兩年,所有未付利息之和*80% (由于大部分轉(zhuǎn)債都是最后兩年開始回售,此處利息按第四年算)
    priceBack = 100 + newRateList[3]
    backPrice = calc_back(newRateList, data["year_left"], priceBack)
    data["backPrice"] = backPrice


    # 回售收益率
    priceHs = format((backPrice - price)/price*100, ".2f")
    data["priceHs"] = priceHs + "%"


    # 回售年化收益率
    priceHsYear = priceHs
    leftYear = float(data["year_left"]) - 2
    if leftYear > 0:
        priceHsYear = format(float(priceHs) / leftYear, ".2f")
    data["priceHsYear"] = priceHsYear + "%"


    return data

根據(jù)利息計算價值

def calc_back(newRateList, yearLeft, priceBack):
    yearLeft = float(yearLeft)


    leftYear = yearLeft - 2
    rateTotal = float(0)
    if leftYear >= 1:
        rateTotal += newRateList[3]
    if leftYear >= 2:
        rateTotal += newRateList[2]
    if leftYear >= 3:
        rateTotal += newRateList[1]
    if leftYear >= 4:
        rateTotal += newRateList[0]


    # 扣除20%的稅
    result = priceBack + rateTotal * 0.8
    return result




def calc_maturity(newRateList, yearLeft, redeemPrice):
    yearLeft = float(yearLeft)


    rateTotal = 0
    if yearLeft > 1:
        # 大于1年,按兩年利息算,最贖回價+ 倒數(shù)第二年的利息
        rateTotal += newRateList[4]
    if yearLeft > 2:
        rateTotal += newRateList[3]
    if yearLeft > 3:
        rateTotal += newRateList[2]
    if yearLeft > 4:
        rateTotal += newRateList[1]
    if yearLeft > 5:
        rateTotal += newRateList[0]


    # 扣除20%的稅
    result = float(redeemPrice) + rateTotal * 0.8
    return result

最終結(jié)果打印

def print_data(data):
    table=PrettyTable(header=False)
    table.add_row(["轉(zhuǎn)債代碼",data["bond_id"]])
    table.add_row(["轉(zhuǎn)債名稱",data["bond_nm"]])
    table.add_row(["現(xiàn)價",data["price"]])
    table.add_row(["評級",data["rating_cd"]])
    table.add_row(["PB(下調(diào)轉(zhuǎn)股價空間)",str(data["pb"])+"(PB越大說明下修轉(zhuǎn)股價的空間越大)"])
    table.add_row(["已轉(zhuǎn)股比例",str(data["cvt_rt"])+"(已轉(zhuǎn)股的比率太多了的話,建議不要買了,公司提升股價的愿望較弱)"])
    table.add_row(["剩余年限",data["year_left"]])
    table.add_row(["到期價值",str(data["maturity"])+"(按當(dāng)前情況買入,持有到期來估算,加上持有中的利息,已扣除利息稅,持有超過1年按2年利息計算)"])
    table.add_row(["到期收益率",data["priceDq"]])
    table.add_row(["到期年化收益率",data["priceDqYear"]])
    table.add_row(["回售價值",str(data["backPrice"])+"(按當(dāng)前情況買入,持有到倒數(shù)第二年計算,加上持有中的利息,已扣除利息稅,持有超過1年按2年利息計算)"])
    table.add_row(["回售收益率",data["priceHs"]])
    table.add_row(["回售年化收益率",data["priceHsYear"]])
    table.add_row(["有無回售條款","無(無回售條款,最好不要買)" if data["put_price"]=="-" else "有"])
    table.add_row(["有無擔(dān)保",data["guarantor"]])
    table.add_row(["轉(zhuǎn)債占比",str(data["convert_amt_ratio"])+"(表示當(dāng)前剩余可轉(zhuǎn)債占當(dāng)前流通市值的比值)"])
    table.add_row(["股東質(zhì)押比例",str(data["pledge"])+"(此值越高,說明公司越缺錢,公司提高股價或者下修轉(zhuǎn)股價的概率越大)"])
    table.add_row(["行業(yè)",data["indusity"]])
    table.add_row(["溢價率",str(data["premium_rt"])+"%"])
    table.add_row(["是否登記強(qiáng)贖","否" if data["force_redeem"]==None else data["force_redeem"].replace("\\r\\n",",")])
    print(table)

主方法調(diào)用

while True:
    print("請輸入要分析的可轉(zhuǎn)債代碼與價格,中間用逗號分隔(如不輸入價格,默認(rèn)按當(dāng)前價),輸入q退出!!")
    input_str=input("請輸入:")
    if input_str==None or input_str.strip()==None or len(input_str)==0:
        print("輸入為空,需要重新輸入")
        continue


    if input_str=="q":
        break


    input_list=input_str.split(",")
    input_code=input_list[0].strip()
    input_price=input_list[1].strip() if len(input_list)>1 else None


    # 獲取可轉(zhuǎn)債列表
    datas=tools.get_bonds_list("https://www.jisilu.cn/data/cbnew/cb_list/?___jsl=LST___t=1609766310721")


    # 查詢轉(zhuǎn)債詳細(xì)信息,及組裝行業(yè),已轉(zhuǎn)股比率等信息
    data=tools.get_bonds_detail(datas,input_code)


    if data==None:
        continue


    # 計算收益率
    if input_price != None:
        data["price"]=input_price
    data=tools.calc_rate(data)


    # 輸出當(dāng)前轉(zhuǎn)債的信息
    tools.print_data(data)

使用案例

圖片

127007 ** 湖廣轉(zhuǎn)債分析**

  • 評級:AA+ ,評級比較高,表示違約的概率小
  • PB:0.63, PB是 市值/凈資產(chǎn),這個值越小,說明公司下調(diào)轉(zhuǎn)股價的空間就越小,小于1,基本上不會下調(diào)轉(zhuǎn)股價了
  • 已轉(zhuǎn)股比例:29.71% , 說明之前漲到了 130以上了,已經(jīng)轉(zhuǎn)了一部分股票了,這個比例還不算高,說明還有一大部分沒轉(zhuǎn)股
  • 到期價值:111.44, 根據(jù)年限及利息,從現(xiàn)在拿著,一直等到到期贖回,每張相當(dāng)于 111.44元
  • 到期收益率:11.38%, 以當(dāng)前的價格買入,持有到期的收益率
  • 到期年化收益率:3.27%, 用到期收益率除以剩余年限,這個收益率比貨幣基金高點,比債券基金少點
  • 回售價值:102.7, 表示從現(xiàn)在開始持有到第四年,加上利息,如果回售的話,每張大概是102.7元,收益率是 2.56%, 年化收益率是 1.79%,價值跟貨幣基金差不多
  • 股東質(zhì)押比例:7.77% , 不是很高,說明公司暫時不是很缺錢,相對而言,轉(zhuǎn)股的動力會比較弱
  • **行業(yè): 有線電視網(wǎng)絡(luò) ** , 這是傳媒行業(yè),根據(jù)之前統(tǒng)計的已退市可轉(zhuǎn)債情況來看,這個行業(yè) 觸發(fā)強(qiáng)贖的概率還是比較高的

**總結(jié)下: **湖廣轉(zhuǎn)債,違約概率很低,最差的情況,以當(dāng)前價格買的話,最后收益略高于貨幣基金。 其所處行業(yè)還不錯,但公司暫時不是很缺錢,暫時基本上不能通過下調(diào)轉(zhuǎn)股價,來增加觸發(fā)強(qiáng)贖概率(說明短期內(nèi),除非市場環(huán)境影響,公司自己主動采取措施提升股價的希望很小)。 但是投資者如果長期持有的話,是不會虧本的,在剩余的3.5年中,還是有不小的概率觸發(fā)強(qiáng)贖的。 整體評價一般。

**注: 以上分析,都是分析在最差的情況下,能有什么樣的收益率,投資可轉(zhuǎn)債想要好收益率,當(dāng)然是在強(qiáng)贖的情況下。 用安道全的話說,每只可轉(zhuǎn)債都應(yīng)該強(qiáng)贖,且概率都很大。 但這兩年發(fā)行的可轉(zhuǎn)債很多,質(zhì)量也都參差不齊,未來是否有轉(zhuǎn)債會違約,誰也說不準(zhǔn),但相信只要在 到期價值以內(nèi)購買,AA級以上的債卷,長期持有,收益率想來是不會太差的,風(fēng)險也小。 巴菲特: 投資的第一條原則是 不要虧損, 第二條原則是, 參照第一條 ...

**

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 分析器
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

    12556
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4807

    瀏覽量

    85037
收藏 人收藏

    評論

    相關(guān)推薦

    偏振分析器

    摘要 線柵偏振,可以使透射光產(chǎn)生線性偏振狀態(tài),是眾多應(yīng)用中常見的一種光學(xué)元件。由于它們的結(jié)構(gòu)在亞波長范圍內(nèi),因此必須對光的傳播進(jìn)行嚴(yán)格的處理。VirtualLab的偏振分析器及其內(nèi)置的RCWA
    發(fā)表于 01-13 08:59

    CCS中性能分析器profile的使用?

    專家好, CCS調(diào)試程序過程中,需要分析下各函數(shù)的執(zhí)行時間,CCS中提供了性能分析器profile Q1:性能分析器profile是否只能在Simulator下才能使用,Emulator下沒有這個功能? Q2:性能
    發(fā)表于 06-21 19:20

    請問python-樹莓派如何通過按鍵控制步進(jìn)電機(jī)正反轉(zhuǎn)?

    步進(jìn)電機(jī)驅(qū)動原理是什么?python-樹莓派如何通過按鍵控制步進(jìn)電機(jī)正反轉(zhuǎn)?
    發(fā)表于 10-09 08:45

    一個高效的語法分析器生成工具

    VPGE(Visual Parser Generation Environment)是一個可視化語法分析器集成開發(fā)環(huán)境,除了具有良好的界面和強(qiáng)大的調(diào)試功能,其LALR(1)分析器的生成速度達(dá)到并超過公認(rèn)的分析器生成速度最快
    發(fā)表于 08-29 10:04 ?16次下載

    一種實用的脈沖幅度分析器

    摘要:通過對高精度脈沖幅度分析器的電路分析,得出了在使用過程中,采用高精度和低溫系數(shù)的電壓基準(zhǔn)集成塊,可保證該脈沖幅度分析器比傳統(tǒng)脈沖幅度分析器靈敏度高、穩(wěn)定
    發(fā)表于 05-25 08:39 ?29次下載

    遙控分析器

    遙控分析器
    發(fā)表于 09-18 14:14 ?632次閱讀
    遙控<b class='flag-5'>分析器</b>

    諧波失真分析器

    諧波失真分析器 電路包括一個1KHZ的低失真
    發(fā)表于 09-23 14:34 ?839次閱讀
    諧波失真<b class='flag-5'>分析器</b>

    網(wǎng)絡(luò)分析器,網(wǎng)絡(luò)分析器原理是什么?

    網(wǎng)絡(luò)分析器,網(wǎng)絡(luò)分析器原理是什么? 網(wǎng)絡(luò)分析器   具有發(fā)現(xiàn)并解決各種故障特性的硬件或軟件設(shè)備
    發(fā)表于 03-22 11:25 ?1064次閱讀

    協(xié)議分析器在WLAN中的應(yīng)用

    協(xié)議分析器在WLAN中的應(yīng)用 協(xié)議分析器廣泛應(yīng)用于有線網(wǎng)絡(luò),成為一類極有用的測試和維護(hù)工具。然而,在WLAN領(lǐng)域,這個問題很有可
    發(fā)表于 03-29 17:11 ?524次閱讀

    靜態(tài)代碼分析器

    Fortify的靜態(tài)代碼分析器(Static Code Analyzer,SCA)是組成Fortify 360的三個分析器之一。SCA工作在開發(fā)階段,以用于分析應(yīng)用程序的源代碼是否存在安全漏洞。這種類型的
    發(fā)表于 04-07 20:32 ?22次下載

    交換機(jī)端口分析器

    本文將重點介紹“交換端口分析器(SPAN)”的工作原理及配置方法。
    發(fā)表于 02-03 14:09 ?1015次閱讀

    python-控制khr3hv-master機(jī)器人

    python-控制khr3hv機(jī)器人,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 11-22 15:40 ?2次下載

    圖形音頻分析器開源設(shè)計

    電子發(fā)燒友網(wǎng)站提供《圖形音頻分析器開源設(shè)計.zip》資料免費下載
    發(fā)表于 08-02 15:18 ?0次下載
    圖形音頻<b class='flag-5'>分析器</b>開源設(shè)計

    Py-spy:用于Python 程序性能監(jiān)控、分析器

    py-spy是用于Python程序的性能監(jiān)控、分析器。它使你可以直觀地看到Python程序花費的時間,而無需重新啟動程序或以任何方式修改代碼。 py-spy的開銷非常低:為了最大化提高速度,它是用
    的頭像 發(fā)表于 10-16 11:50 ?935次閱讀
    Py-spy:用于<b class='flag-5'>Python</b> 程序性能監(jiān)控、<b class='flag-5'>分析器</b>

    py-spy:用于Python程序的性能監(jiān)控、分析器

    py-spy是用于Python程序的性能監(jiān)控、分析器。它使你可以直觀地看到Python程序花費的時間,而無需重新啟動程序或以任何方式修改代碼。 py-spy的開銷非常低:為了最大化提高速度,它是用
    的頭像 發(fā)表于 11-01 10:13 ?1257次閱讀
    py-spy:用于<b class='flag-5'>Python</b>程序的性能監(jiān)控、<b class='flag-5'>分析器</b>
    全讯网图库| 百家乐官网等投注网改单| 24 山杨公斗首择日吉凶| 大发888信誉娱乐城管理| 百家乐官网赌钱| 百家乐看| 百家乐官网真人游戏开户| 百家乐3珠路法| 百家乐官网娱乐城介绍| 百家乐投注外挂| 天台县| 百家乐玩揽法的论坛| 全椒县| 作弊百家乐赌具| 川宜百家乐官网破解版| 百家乐网上真钱娱乐网| 高档百家乐桌子| 百家乐官网路单网下载| 怎样玩百家乐才能| 百家乐官网白菜价| 大发888 澳门赌场| 千亿百家乐官网的玩法技巧和规则 | 百家乐保证赢| 百家乐官网智能分析| 大发888娱乐场登陆| 立博百家乐官网的玩法技巧和规则 | 百家乐官网赌场在线娱乐| 威尼斯人娱乐城赌球| 南宁百家乐官网的玩法技巧和规则 | 百家乐官网筹码套装100片| 大赢家娱乐城怎么样| 百家乐视频二人雀神| 百家乐官网视频游戏账号| 帝王百家乐的玩法技巧和规则 | 百家乐看点打法| 百家乐官网体育博彩| 百家乐官网打线| 手机棋牌游戏| 聚众玩百家乐官网的玩法技巧和规则 | 百家乐英皇娱乐网| 香港百家乐官网玩|