针对A股市场的相对稳健的可转债量化策略 例子学习

我们来设计一些针对A股市场的、相对稳健的可转债量化策略,并用Python举例说明。

可转债的核心特性与策略基础

可转债(Convertible Bond, CB)兼具债性股性

  1. 债性:持有到期可获得本金和利息,提供了一定的下行保护(理论最低价是纯债价值,极端情况除外)。关键指标:纯债价值、到期收益率(YTM)。
  2. 股性:在特定条件下可以转换为对应公司的股票,提供了上行潜力。关键指标:转股价值、转股溢价率。

稳健的策略通常利用其“下有保底(债性),上不封顶(股性)”的特点,寻找风险收益比较好的投资机会。

几种比较稳健的可转债量化策略模式

以下是一些常见的、相对稳健的策略思路:

1. 双低策略 (Low Price, Low Premium Strategy)

  • 逻辑:寻找价格低转股溢价率低的可转债。
    • 低价格意味着距离纯债价值(理论底)较近,下跌空间相对有限。
    • 低转股溢价率意味着转债价格与其内在的股票价值(转股价值)偏离较小,股性较强,更容易跟随正股上涨。
  • 目标:在控制下行风险的同时,捕捉正股上涨带来的收益。这是目前市场上最流行和广泛认可的策略之一。
  • 关键指标
    • 可转债价格 (Price)
    • 转股溢价率 (Conversion Premium = (转债价格 - 转股价值) / 转股价值 * 100%)
  • 筛选条件 (示例)
    1. 剔除价格过高(如 > 130元)或过低(如 < 100元,视市场情况调整)的转债。
    2. 剔除转股溢价率过高(如 > 30%)的转债。
    3. 计算“双低值” = 转债价格 + 转股溢价率。
    4. 选择“双低值”最低的一批转债(如前10或前20只)。
    5. (可选)加入其他过滤条件:剩余期限 > 1年、到期收益率 > 0、市值/成交额(流动性)要求、信用评级等。
  • Python 示例 (核心逻辑)
import pandas as pd

# 假设 df 是包含可转债数据的 DataFrame
# 需要列: 'bond_code', 'bond_name', 'price', 'conv_value', 'conv_premium', 'ytm', 'maturity_years', 'rating'

def select_double_low_bonds(df, top_n=20, min_price=100, max_price=130, max_premium=30, min_ytm=0, min_maturity=1):
    """
    筛选双低可转债策略的核心逻辑
    """
    # 1. 基础过滤
    df_filtered = df[
        (df['price'] >= min_price) &
        (df['price'] <= max_price) &
        (df['conv_premium'] <= max_premium) &
        (df['ytm'] >= min_ytm) &
        (df['maturity_years'] >= min_maturity)
        # 可以添加评级、流动性等过滤条件
        # (df['rating'].isin(['AA', 'AA+', 'AAA'])) &
        # (df['volume'] > some_threshold)
    ].copy() # 使用 .copy() 避免 SettingWithCopyWarning

    # 2. 计算双低值
    # 注意:这里的溢价率单位是 %,直接相加时需要注意量纲,常见做法是直接用数值相加
    # 例如 Price = 110, Premium = 15 (%), 双低值 = 110 + 15 = 125
    df_filtered['double_low_value'] = df_filtered['price'] + df_filtered['conv_premium']

    # 3. 排序并选择 Top N
    selected_bonds = df_filtered.sort_values(by='double_low_value').head(top_n)

    return selected_bonds[['bond_code', 'bond_name', 'price', 'conv_premium', 'double_low_value', 'ytm']]

# --- 模拟数据 ---
data = {
    'bond_code': ['128001', '113502', '123018', '110059', '127012'],
    'bond_name': ['转债A', '转债B', '转债C', '转债D', '转债E'],
    'price': [115.5, 108.2, 125.0, 135.0, 112.0],
    'conv_value': [105.0, 100.1, 110.5, 120.0, 95.0],
    'ytm': [0.5, 1.2, -0.1, 0.8, 1.5],
    'maturity_years': [3.5, 2.1, 4.0, 1.5, 5.0],
    'rating': ['AA', 'AA+', 'AAA', 'AA-', 'AA']
}
df_sample = pd.DataFrame(data)
# 计算转股溢价率 (假设 conv_value > 0)
df_sample['conv_premium'] = (df_sample['price'] - df_sample['conv_value']) / df_sample['conv_value'] * 100
# 处理 conv_value <= 0 的情况 (例如设为极大值或NaN)
df_sample.loc[df_sample['conv_value'] <= 0, 'conv_premium'] = float('inf')


# --- 执行策略 ---
selected = select_double_low_bonds(df_sample, top_n=3, max_price=130) # 调整 max_price 看看效果
print("双低策略选债结果:")
print(selected)

2. 低溢价率/折价策略 (Low Premium / Discount Strategy)

  • 逻辑:专注于寻找转股溢价率非常低,甚至是负溢价(折价,即转债价格低于转股价值)的可转债。
  • 目标
    • 折价转债理论上存在套利空间(买入转债,转股后卖出股票),但实际操作有T+1限制、冲击成本、融券难等问题。
    • 更现实的目标是,低溢价/折价意味着转债价格紧密跟随正股,如果看好正股未来表现,买入这类转债能更有效地分享正股上涨收益,且相比直接买股票有债底保护。
  • 关键指标:转股溢价率。
  • 筛选条件 (示例)
    1. 选择转股溢价率最低的一批转债(如 < 5% 或 < 0%)。
    2. (可选)结合正股的基本面或技术面分析(如选择正股处于上升趋势的低溢价转债)。
    3. (可选)过滤掉临近到期、强赎或回售期的转债,因为这些事件会影响价格。
    4. (可选)流动性、评级等过滤。
  • Python 示例 (核心逻辑)
import pandas as pd

# 假设 df 是包含可转债数据的 DataFrame (同上)

def select_low_premium_bonds(df, top_n=10, max_premium=5, min_maturity=0.5):
    """
    筛选低溢价率可转债策略的核心逻辑
    """
    # 1. 基础过滤 (可以根据需要添加更多过滤)
    df_filtered = df[
        (df['conv_premium'] <= max_premium) &
        (df['maturity_years'] >= min_maturity) &
        (df['conv_value'] > 0) # 确保转股价值有效
        # 过滤临近特殊条款触发的转债 (需要额外数据)
        # (df['near_call_trigger'] == False) &
        # (df['near_put_trigger'] == False)
    ].copy()

    # 2. 排序并选择 Top N
    selected_bonds = df_filtered.sort_values(by='conv_premium').head(top_n)

    return selected_bonds[['bond_code', 'bond_name', 'price', 'conv_premium', 'conv_value', 'ytm']]

# --- 使用上面的 df_sample 模拟数据 ---
selected_low_prem = select_low_premium_bonds(df_sample, top_n=3, max_premium=15) # 放宽 premium 条件看效果
print("\n低溢价策略选债结果:")
print(selected_low_prem)

3. 高YTM/债底策略 (High YTM / Bond Floor Strategy)

  • 逻辑:将可转债视为一种特殊的债券,寻找到期收益率(YTM)较高价格接近纯债价值的品种。
  • 目标:获取相对稳定的票息和到期收益,主要依赖其债性,适合风险偏好较低的投资者。当市场整体下跌或正股表现不佳时,这类转债的抗跌性相对较强。
  • 关键指标
    • 到期收益率 (YTM)
    • 纯债价值 (Pure Bond Value) - 计算较复杂,通常需要贴现未来现金流。有时用“纯债溢价率 = (转债价格 - 纯债价值) / 纯债价值 * 100%”来衡量。
    • 或者简化为:选择价格较低(如100元附近)且YTM为正的转债。
  • 筛选条件 (示例)
    1. 选择YTM最高的一批转债。
    2. 要求价格不能过高(如 < 115元)。
    3. 剔除信用评级过低的转债(如 AA- 以下),以防范信用风险。
    4. (可选)剩余期限不能太短(如 > 1年),以获得足够的时间价值或等待转机。
    5. (可选)关注回售条款,如果价格低于回售价且满足回售条件,可能带来额外的安全垫或博弈机会(但回售套利空间通常不大且有不确定性)。
  • Python 示例 (核心逻辑 - 基于YTM)
import pandas as pd

# 假设 df 是包含可转债数据的 DataFrame (同上)

def select_high_ytm_bonds(df, top_n=10, max_price=115, min_ytm=1.0, min_maturity=1, min_rating='AA-'):
    """
    筛选高YTM可转债策略的核心逻辑
    """
    # 评级排序字典 (示例)
    rating_map = {'AAA': 5, 'AA+': 4, 'AA': 3, 'AA-': 2, 'A+': 1} # 数字越大越好

    # 1. 基础过滤
    df_filtered = df[
        (df['price'] <= max_price) &
        (df['ytm'] >= min_ytm) &
        (df['maturity_years'] >= min_maturity) &
        # 评级过滤 (假设评级是字符串)
        (df['rating'].map(rating_map) >= rating_map.get(min_rating, -1)) # .get 提供默认值处理不在map中的评级
    ].copy()

    # 2. 排序并选择 Top N (按 YTM 降序)
    selected_bonds = df_filtered.sort_values(by='ytm', ascending=False).head(top_n)

    return selected_bonds[['bond_code', 'bond_name', 'price', 'ytm', 'rating', 'maturity_years']]

# --- 使用上面的 df_sample 模拟数据 ---
selected_high_ytm = select_high_ytm_bonds(df_sample, top_n=3, min_ytm=0.5, min_rating='AA') # 调整 ytm 和评级条件
print("\n高YTM策略选债结果:")
print(selected_high_ytm)

数据需求

要实现这些策略,你需要获取以下数据:

  • 实时/日频行情数据
    • 转债代码、名称
    • 转债价格 (最新价)
    • 成交量/成交额 (用于流动性过滤)
  • 基本信息 & 计算指标
    • 正股代码、名称
    • 正股价
    • 转股价
    • 转股价值 (需要实时计算: 100 / 转股价 * 正股价)
    • 转股溢价率 (需要实时计算)
    • 剩余期限
    • 到期收益率 (YTM) - 这个计算相对复杂,通常由数据服务商提供或自行实现债券定价模型计算。
    • 纯债价值 - 同YTM,计算复杂,依赖于基准利率曲线和信用利差。
    • 信用评级
    • 回售触发价、强赎触发价 (用于风险提示或特殊策略)
    • 发行规模/剩余规模 (用于流动性参考)

数据来源

  • 付费数据接口:Wind、同花顺iFinD、东方财富Choice、恒生聚源等(数据全面、准确,适合专业机构或个人)。
  • 免费/半免费数据接口:Tushare (有积分限制)、JoinQuant聚宽、米筐RQData等 (提供基础数据,可能需要自己计算部分指标)。
  • 财经网站爬虫:如东方财富网、集思录等(需要注意合规性和网站反爬机制,数据清洗工作量大)。

Python实现注意事项

  1. 数据获取与清洗:使用 requests, pandas, akshare, tushare 等库获取数据,并进行必要的清洗(处理缺失值、异常值、统一格式)。
  2. 指标计算:确保转股价值、转股溢价率等核心指标计算正确。YTM和纯债价值若自行计算,需掌握债券定价知识。
  3. 策略回测:使用 backtrader, zipline, vnpy 等框架进行历史回测,评估策略的夏普比率、最大回撤、年化收益等指标。这是验证策略有效性的关键步骤。
  4. 交易执行:可以通过券商提供的API(如华泰、中泰XTP、东方财富LTS等)进行程序化交易,或手动执行。
  5. 风控管理
    • 分散投资:不要把所有资金投入单个或少数几个转债。持有一定数量(如10-20只)的组合。
    • 动态调仓:定期(如每周、每两周或每月)根据策略重新筛选持仓,卖出不符合条件的,买入新符合条件的。
    • 止损/止盈:虽然转债有债底保护,但极端情况下也会大跌。可以考虑设置基于组合整体回撤或单个转债价格/溢价率变化的止损/止盈规则(但要小心过于频繁触发)。
    • 关注公告:留意转债的强赎、回售、下修转股价等公告,这些可能对策略产生重大影响。

总结

  • 双低策略是目前A股市场应用最广、相对稳健且简单有效的可转债策略之一。
  • 低溢价/折价策略更侧重于捕捉股性机会,需要对正股有一定判断。
  • 高YTM/债底策略更侧重于债性防御,适合低风险偏好者。

选择哪种策略或组合使用,取决于你的风险偏好、市场判断和可投入的研究精力。无论哪种策略,持续的数据维护、严格的回测验证和合理的风险控制都是成功的关键。

免责声明:以上策略仅为示例和思路分享,不构成任何投资建议。金融市场存在风险,投资需谨慎。在实际应用前,请务必进行充分的研究和回测。

<think>好的,我需要帮助用户找到使用akshare获取上证50ETF历史数据的方法。首先,我应该回忆一下用户提供的引用内容,看看是否有相关的示例代码。 用户提供的引用中有几个提到akshare的使用。引用[2]和引用[4]都提到了使用ak.index_zh_a_hist和fund_etf_hist_em函数来获取指数和ETF的数据。特别是引用[4]中的代码示例使用了fund_etf_hist_em函数,并指定了symbol为"510300",这对应的是沪深300ETF。因此,推测上证50ETF的代码可能是另一个,比如510050。 接下来,我需要确认上证50ETF的正确代码。通常,上证50ETF的代码是510050,但最好让用户确认一下。不过根据常见情况,可以先假设是这个代码。 然后,查看akshare的文档或示例,确认fund_etf_hist_em函数是否适用于ETF基金的历史数据。引用[4]中的代码确实使用了这个函数,所以应该适用。参数方面,symbol应该是ETF的代码,period是周期,start_date和end_date是日期范围,adjust可能指是否复权。 因此,代码的大致结构应该是这样的:导入akshare,调用fund_etf_hist_em函数,传入正确的symbol参数。例如,将symbol设为"510050",调整日期范围,然后打印结果。 另外,需要提醒用户安装akshare库,如果尚未安装的话,可以通过pip install akshare来安装。 可能需要注意的问题包括:日期格式是否正确,代码是否存在,以及是否有必要处理数据中的缺失或异常值。此外,akshare的接口可能会更新,所以如果代码运行出错,建议用户查看官方文档或社区支持。 总结步骤:安装akshare,使用fund_etf_hist_em函数,替换正确的ETF代码,调整日期参数,执行代码获取数据。同时,给出示例代码,并解释各个参数的作用,帮助用户理解如何修改以适应自己的需求。</think>以下是使用akshare获取上证50ETF(代码:510050)历史数据的详细方法和代码示例: ### 方法说明 上证50ETF的历史数据可以通过akshare的`fund_etf_hist_em`接口获取[^4]。该接口支持以下参数: - `symbol`:ETF基金代码(如510050) - `period`:数据周期(日线"daily"、周线"weekly"、月线"monthly") - `start_date`/`end_date`:日期范围(格式:yyyymmdd) - `adjust`:复权类型(空字符串表示不复权,"hfq"后复权,"qfq"前复权) ### 代码示例 ```python import akshare as ak # 获取上证50ETF日线数据(2023年至今) symbol = "510050" # 上证50ETF代码 etf_data = ak.fund_etf_hist_em( symbol=symbol, period="daily", start_date="20230101", end_date="20240729", adjust="" ) print(etf_data) ``` ### 输出字段说明 ``` 日期 开盘价 收盘价 最高价 最低价 成交量(手) 成交额(元) 振幅(%) 涨跌幅(%) 涨跌额(元) 换手率(%) 2023-01-04 2.651 2.668 2.669 2.643 2.47E+06 6.56E+08 0.97 0.64 0.017 0.38 2023-01-05 2.670 2.661 2.673 2.650 2.15E+06 5.73E+08 0.86 -0.26 -0.007 0.33 ... ``` ### 注意事项 1. 需先安装akshare库:`pip install akshare --upgrade` 2. 日期范围不能超过当前日期 3. 若获取失败请检查网络连接和参数格式 4. 建议添加异常处理: ```python try: etf_data = ak.fund_etf_hist_em(...) except Exception as e: print(f"获取数据失败:{str(e)}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值