“优矿”集思录——分级基金专题

来源:https://uqer.io/community/share/561da7d9f9f06c4c5e2fb5cc

前言:

从14年7月份开始,伴随着牛市的到来,一个不怎么知名的投资标的大放光彩——分级基金

虽说分级基金是牛市产物,但对于短期的反弹行情其一样也是众多投资物中的一颗明珠,只要抓好反弹行情,随便吃几个涨停也是妥妥的

但分级基金相对复杂,要注意好分级基金的上下折、杠杆、折溢价等问题

本文假设读者已经对分级基金有一定的了解,只要运行代码就可以得到常见重要的分级基金相关指标,旨在成为投资者身边分级基金好工具

结合笔者平时的投资习惯,总结的指标主要有:母基金跟踪指数,整体溢价率,AB各自溢价率,B类价格杠杆,母基金下折需要跌多少,其他常见指标

用法:

运行下面的代码,即可以得到关于母基金、A份额、B份额,如上列举的所有指标

同时还可以选择输出结果排序规则等

有一定编程基础的读者,建议详细阅读函数说明,自行使用

def get_leverage_fund(show_type='M', order_by='discount_rate', order_method='desc', date=None):
    '''
    输入参数:
       show_type  str,展示/返回的数据,'T'为返回所有,'A'为返回A类相关,'B'为返回B类相关,'M'为返回母基金相关
       order_by  str,返回结果的排序属性列,可选的为'B_leverage'(B类价格杠杆),'ticker'(交易代码),'discount_rate'(整体溢价率)
       order_method  str,排序规则,降序('desc'),升序('acd')
    输出参数:
       计算好指标的dataframe,同时还将结果直接打印出来
    '''

    import pandas as pd
    import numpy as np
    from CAL.PyCAL import *

    if show_type not in ['T','A','B','M']:
        raise ValueError('show type 必须为T,A,B,M中的一个!')

    if order_by not in ['B_leverage','ticker','discount_rate']:
        raise ValueError('order_by 必须为B_leverage,ticker,discount_rate中的一个!')

    if order_method not in ['desc','acd']:
        raise ValueError('order_method 必须为desc,acd中的一个!')

    # 日期默认为前一个工作日
    if date is None:
        date = Date.todaysDate()
        cal = Calendar('China.SSE')
        period = Period('-1B')
        date = cal.advanceDate(date, period)
        date = date.toDateTime().strftime('%Y%m%d')
    elif not (isinstance(date, str) and len(date) == 8):
        raise ValueError('date必须为xxxxxxxx字符串类型日期格式!') 

    # 所有股票类分级基金ticker
    funds = DataAPI.FundLeverageInfoGet(exchangeCDLeverage=['XSHG','XSHE'], field='ticker,secShortName,tickerLeverage,secShortNameLeverage,shareType,category,,shareProp,idxCn,splitNote,downThrshold')
    funds_total = funds[funds['category']=='E']
    funds_total.drop('category', axis=1, inplace=True)
    funds_total.columns = ['母基金代码','母基金简称','子基金代码','子基金简称','份额类别','分拆比例A/B','跟踪指数','折算说明','下折B阈值']
    funds_total['子基金代码'] = funds_total['子基金代码'].apply(str)
    funds_total['分拆比例A/B'][funds_total['分拆比例A/B'] == 1] = 5.0

    # 替换基金简称
    codes = funds_total.drop_duplicates('母基金代码')['母基金代码'].tolist()
    codes_leverage = map(str,funds_total['子基金代码'].tolist())
    short_names = DataAPI.FundGet(ticker=codes_leverage+codes, listStatusCd=['L','UN'], field='ticker,tradeAbbrName', pandas='1')
    tmp = pd.merge(funds_total, short_names, how='left', left_on='母基金代码', right_on='ticker')
    funds_total['母基金简称'] = tmp['tradeAbbrName']
    tmp = pd.merge(funds_total, short_names, how='left', left_on='子基金代码', right_on='ticker')
    funds_total['子基金简称'] = tmp['tradeAbbrName']

    # 取净值
    net_values = DataAPI.FundNavGet(ticker=codes+codes_leverage, dataDate=date, field='ticker,NAV', pandas='1')
    tmp = pd.merge(funds_total, net_values, how='left', left_on='母基金代码', right_on='ticker')
    funds_total['母基金净值'] = tmp['NAV']
    tmp = pd.merge(funds_total, net_values, how='left', left_on='子基金代码', right_on='ticker')
    funds_total['子基金净值'] = tmp['NAV']

    # 取行情
    prices = DataAPI.MktFunddGet(ticker=codes+codes_leverage, field='ticker,closePrice', tradeDate=date, pandas='1')
    tmp = pd.merge(funds_total, prices, how='left', left_on='子基金代码', right_on='ticker')
    funds_total['子基金价格'] = tmp['closePrice']
    funds_total['子基金溢价率'] = funds_total['子基金价格'] / funds_total['子基金净值'] - 1

    # 计算相关指标,合并dataframe
    funds_A = funds_total[funds_total['份额类别'] == 'A']
    funds_A.drop('份额类别',axis=1, inplace=True)
    funds_B = funds_total[funds_total['份额类别'] == 'B'][['母基金代码','子基金代码','子基金简称','子基金净值','子基金价格','子基金溢价率']]
    funds_B.columns = [['母基金代码','B类代码','B类简称','B类净值','B类价格','B类溢价率']]
    funds_leverage = pd.merge(funds_A, funds_B, how='left', on='母基金代码')
    funds_leverage.rename(columns={'子基金代码':'A类代码', '子基金简称':'A类简称', '子基金净值':'A类净值', '子基金价格':'A类价格', '子基金溢价率':'A类溢价率'}, inplace=True)
    funds_leverage['整体溢价率'] = (funds_leverage['A类价格'] * (funds_leverage['分拆比例A/B'] / 10) + funds_leverage['B类价格'] * (1 - funds_leverage['分拆比例A/B'] / 10)) / funds_leverage['母基金净值'] -1
    funds_leverage['B类价格杠杆'] = (funds_leverage['A类价格'] * funds_leverage['分拆比例A/B'] / 10 + funds_leverage['B类价格'] * (1 - funds_leverage['分拆比例A/B'] / 10)) / funds_leverage['B类价格'] / (1 - funds_leverage['分拆比例A/B'] / 10)
    funds_leverage['下折母需跌'] = 1 - (funds_leverage['A类净值'] * funds_leverage['分拆比例A/B'] / 10 + funds_leverage['下折B阈值'] * (1 - funds_leverage['分拆比例A/B'] / 10)) / funds_leverage['母基金净值']
    funds_leverage = funds_leverage[['母基金代码','母基金简称','母基金净值','整体溢价率','跟踪指数','分拆比例A/B','下折母需跌','A类代码','A类简称','A类净值','A类价格','A类溢价率','B类代码','B类简称','B类净值','B类价格','B类溢价率','B类价格杠杆','下折B阈值','折算说明']]
    funds_leverage['B类价格杠杆'] = np.round(funds_leverage['B类价格杠杆'], 2)
    funds_leverage.dropna(inplace=True)
    funds_leverage['整体溢价率'] = pd.Series(["{0:.1f}%".format(val * 100) for val in funds_leverage['整体溢价率']], index = funds_leverage.index)
    funds_leverage['A类溢价率'] = pd.Series(["{0:.1f}%".format(val * 100) for val in funds_leverage['A类溢价率']], index = funds_leverage.index)
    funds_leverage['B类溢价率'] = pd.Series(["{0:.1f}%".format(val * 100) for val in funds_leverage['B类溢价率']], index = funds_leverage.index)
    funds_leverage['下折母需跌'] = pd.Series(["{0:.1f}%".format(val * 100) for val in funds_leverage['下折母需跌']], index = funds_leverage.index)

    # 返回类型
    if show_type == 'T':
        columns = funds_leverage.columns
    elif show_type == 'A':
        columns = ['A类代码','A类简称','A类净值','A类价格','A类溢价率','整体溢价率','跟踪指数']
    elif show_type == 'B':
        columns = ['B类代码','B类简称','B类净值','B类价格','B类溢价率','B类价格杠杆','下折B阈值','整体溢价率','跟踪指数']
    else:
        columns = ['母基金代码','母基金简称','母基金净值','整体溢价率','跟踪指数','分拆比例A/B','下折母需跌','折算说明']

    # 排序
    if order_by == 'B_leverage':
        order_by = 'B类价格杠杆'
    elif order_by == 'ticker':
        order_by = '母基金代码'
    else:
        order_by = '整体溢价率'

    if order_method == 'acd':
        res = funds_leverage.sort(columns=order_by, ascending=True)[columns]
    else:
        res = funds_leverage.sort(columns=order_by, ascending=False)[columns]
    res = res.reset_index().drop('index', axis=1)
    res
    return res
get_leverage_fund()
母基金代码 母基金简称 母基金净值 整体溢价率 跟踪指数 分拆比例A/B 下折母需跌 折算说明
0 160420 华安50 0.6705 3.7% 创业板50 5 5.6% 每年12月15日定折,遇节假日顺延,A类不参与上折
1 160633 鹏华证券 0.6740 2.6% 证券公司 5 5.5% 每年11月第一个工作日定折
2 160634 鹏华环保分级 1.1280 2.5% 中证环保 5 44.5% 每年11月第一个工作日定折,B类不参与定折
3 161819 银华资源 1.0770 2.5% 内地资源 4 47.1% 每年第一个工作日定折
4 502020 国金50 1.1770 2.5% 上证50 5 46.6% 每年12月15日定折,遇节假日顺延
5 164821 工银新能源 0.8108 2.4% 中证新能 5 21.9% 每年1月第一个工作日定折(成立不足6个月、下折不足1个月除外)
6 502023 钢铁分级 1.0230 2.4% 国证钢铁 5 38.5% 每年9月第一个工作日定折,距离成立或上下折不满3个月除外,每次折算后调整约定利率
7 502026 新丝路 1.0090 2.4% 新丝路 5 37.7% 每年9月第一个工作日定折,距离成立或上下折不满3个月除外,每次折算后调整约定利率
8 160628 鹏华地产 0.9890 2.3% 800地产 5 36.0% 每年第一个工作日定折
9 164820 工银高铁 0.7691 2.1% 高铁产业 5 17.9% 每年第一个工作日定折,A类不参与上折
10 167301 方正保险 0.9270 2.0% 保险主题 5 32.0% 每年12月15日定折,遇节假日顺延,基金合同生效不足六个月的除外,上下折不足1个月除外
11 164809 工银500 1.4138 1.8% 中证 500 4 59.7% 每年第一个工作日定折
12 161028 富国新能源 0.8540 1.7% CS新能车 5 24.9% 12/15
13 165315 建信网金融 0.9880 1.3% 互联金融 5 36.1% 每年12月第一个工作日定折
14 162413 华宝1000 0.8673 1.2% 中证1000 5 27.0% 每年12月15日定折,每次定折或不定折基准日变更利率
15 165511 信诚500 1.1920 1.2% 中证 500 4 53.7% 02/06,定折日为非工作日则提前
16 502056 医疗分级 0.8919 0.9% 中证医疗 5 29.2% 每年12月15日定折(遇节假日顺延,上下折不足3个月除外)
17 160637 鹏华创业板 0.7430 0.7% 创业板指 5 14.7% 每年12月第一个工作日定折
18 161628 融通军工 0.9780 0.7% 中证军工 5 35.2% 每年12月15日定折,遇节假日提前,A类不参与上折
19 161910 万家中创 1.1115 0.7% 创业成长 5 43.4% 每年第一个工作日定折
20 160418 华安银行 0.7871 0.6% 中证银行 5 19.2% 每年12月15日定折,节假日顺延,A类不参与上折,B类不参与定折
21 162412 华宝医疗 0.8583 0.6% 中证医疗 5 26.3% 每年12月15日定折,遇节假日提前,每次定折或不定折基准日变更利率
22 168001 国寿养老 0.8770 0.5% 养老产业 5 27.8% 每年12月15日定折,遇节假日提前
23 160517 博时银行 0.8485 0.3% 中证银行 5 25.2% 每年12月第一个工作日定折,B类不参与定折
24 160629 鹏华传媒 1.1880 0.3% 中证传媒 5 47.1% 每年12月第一个工作日定折
25 160630 鹏华国防 1.2940 0.3% 中证国防 5 51.5% 每年12月第一个工作日定折
26 164819 工银环保 0.8604 0.3% 中证环保 5 26.4% 每年第一个工作日定折,成立不足半年可不定折
27 160625 鹏华证保 1.1500 0.2% 800证保 5 45.3% 每年第一个工作日定折
28 161719 招商可转债 1.0690 0.2% 中信转债 7 21.0% 每年12月15日定折,每3年折为母基金再拆分
29 162107 金鹰中证500 1.0987 0.2% 中证 500 5 42.9% 每年第一个工作日定折
... ... ... ... ... ... ... ... ...
73 164401 前海健康 1.0530 -0.5% 健康产业 5 39.0% 每年第一个工作日定折
74 165521 信诚金融 0.9160 -0.5% 800金融 5 29.1% 12/15
75 167503 安信一带一路 0.9160 -0.5% 一带一路 5 31.1% 每年12月15日定折节假日提前
76 502016 长信一带一路 1.0350 -0.5% 一带一路 5 39.2% 每年12月15日定折,遇节假日提前,距离成立或上下折不满3个月除外
77 168203 中融钢铁 0.9230 -0.4% 国证钢铁 5 31.9% 每年12月15日定折,遇节假日提前
78 160127 南方消费 0.9730 -0.3% 内地消费 5 36.8% 03/13,定折时A/B/M全归1,可顺延定折日
79 161726 招商生物 1.0360 -0.3% 生物医药 5 39.0% 每年12月15日定折,遇节假日顺延
80 162010 长城久兆 1.1360 -0.3% 中小300P 4 51.4% 01/30,可提前定折日
81 162509 国联安双禧 1.3030 -0.3% 中证100 4 57.4% 2016/04/16,每三年定折时A/B/M全归1,定折日为非工作日则提前
82 164905 交银新能源 1.1900 -0.3% 国证新能 5 47.3% 每年第一个工作日定折
83 165515 信诚300 0.7410 -0.3% 沪深300 5 13.8% 12/15
84 167601 国金300 0.9048 -0.3% 沪深300 5 28.3% 每年第一个工作日定折
85 160417 华安300 1.2690 -0.2% 沪深300 5 46.8% 每年第一个工作日定折
86 161022 富国创业板 1.1030 -0.2% 创业板指 5 43.0% 每年第一个工作日定折
87 161030 富国体育 0.8940 -0.2% 中证体育 5 29.2% 每年12月第一个工作日定折
88 161721 招商300地产 0.7360 -0.2% 地产等权 5 13.6% 12/15
89 161724 招商煤炭 0.9560 -0.2% 煤炭等权 5 33.9% 每年12月15日定折,遇节假日顺延
90 163209 诺安中创 1.2210 -0.2% 创业成长 4 54.8% 每年第一个工作日定折
91 164811 工银100 1.2346 -0.2% 深证100P 5 48.7% 07/01
92 160219 国泰医药 0.8360 -0.1% 国证医药 5 23.3% 每年第一个工作日定折,每次定折或不定折基准日变更利率
93 160516 博时证保 1.0758 -0.1% 800证保 5 41.6% 每年12月第一个工作日定折
94 161031 富国工业4 1.0710 -0.1% 工业4.0 5 41.3% 每年12月第一个工作日定折,B类不参与定折
95 161718 招商300高贝 0.8140 -0.1% 300高贝 5 21.1% 12/15
96 161812 银华100 0.9530 -0.1% 深证100R 5 32.1% 每年第一个工作日定折
97 163109 申万深成 0.6555 -0.1% 深证成指 5 12.7% 每年第一个工作日定折,无下折,A不参与上折,净值<1元无定折
98 164508 国富100 0.8310 -0.1% 中证100 5 22.8% 每年第一个工作日定折
99 168204 中融煤炭 0.7310 -0.1% 中证煤炭 5 13.2% 每年12月15日定折,遇节假日提前
100 161029 富国银行 0.8940 -0.0% 中证银行 5 28.7% 每年12月15日
101 161629 融通证券 0.7770 -0.0% 证券公司 5 18.7% 每年12月15日定折,A类不参与上折
102 167701 德邦德信 1.0520 -0.0% 中高企债 7 20.9% 每次折算后2周年定折转为母基再拆分
103 rows × 8 columns

results matching ""

    No results matching ""