转债打新监听

博客提及不参与炒股,专注于转债打新以获取小收益,涉及Java技术可能用于转债监听等相关操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不炒股,只打新捡点小钱

package com.github.niefy.modules.job.run;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author :网寻星公众号
 * @date :Created in 2023/9/11 17:59
 * @description:监听转债打新
 * @modified By:
 * @version: 1.0$
 */
@Slf4j
public class BondSubscriptionTask {

    public static String getBondSubscriptionTask() {
        StringBuilder sb = new StringBuilder();
        String url = "https://fintechappdr.cgws.com/biz/customer-helper/app/a/ipo/calendar/bond/recentSubscribe";
        try {
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("GET");
            int responseCode = con.getResponseCode();
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();
            if (responseCode == 200) {
                JSONObject jsonObject = JSONUtil.parseObj(response.toString());
                jsonObject = JSONUtil.parseObj(jsonObject.get("data"));
                List<Map> mapList = Convert.toList(Map.class,jsonObject.get("items"));
                // 获取今天的日期
                LocalDate today = LocalDate.now();
                // 过滤出今天的数据
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
                List<Map> filteredList = mapList.stream()
                        .filter(data -> LocalDate.parse((String) data.get("s_ipo_subdate"), formatter).equals(today))
                        .collect(Collectors.toList());
                filteredList.stream().forEach(x->{
                    sb.append("\n转债名称:" + x.get("lnk_stkname").toString() + "(" + x.get("lnk_stkcode").toString() +  ")");
                    sb.append("\n申购日期:" + x.get("s_ipo_subdate").toString());
                    sb.append("\n发行量:" + x.get("cb_list_issuesize").toString());
                    BigDecimal roundedResult = NumberUtil.round(Double.valueOf(x.get("cb_clause_iniconvprice").toString()) / Double.valueOf(x.get("currentPrice").toString()), 4);
                    BigDecimal subtractedResult = roundedResult.subtract(BigDecimal.ONE);
                    BigDecimal multipliedResult = NumberUtil.round(subtractedResult.multiply(new BigDecimal("100")), 2);
                    sb.append("\n溢价率:" + multipliedResult + " %");
                    sb.append("\n正股名称:" + x.get("stkname").toString() + "(" + x.get("stkcode").toString() +  ")");
                    sb.append("\n中签资金冻结日期:" + x.get("s_fellow_unfrozedate").toString());
                    sb.append("\n公司概念:" + x.get("briefing").toString());
                    sb.append("\n");
                });
                log.info(sb.toString());
            } else {
                System.out.println("请求失败,响应码:" + responseCode);
            }
            return sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
    public static void main(String[] args) {
        getBondSubscriptionTask();
    }
}

<think>嗯,用户这次想找用backtrader实现可转债网格交易策略的方法或示例代码。从对话历史看,用户之前提到过均线交叉策略的回测实现,还关注Python金融量化内容。用户应该是个量化交易爱好者,可能正在探索的交易策略实现方案。可转债网格策略的关键点在于要同时处理债股联动特性和区间震荡逻辑。backtrader虽然没直接提供网格模块,但完全可以通过定制技术实现。需要特别注意可转债特有的转股溢价率、强制赎回等特性参数配置。首先考虑策略核心框架设计:明确网格参数体系(格数、间距)、标的筛选逻辑(转股溢价率阈值)、异常处理(强赎公告触发平仓)。然后构建三个核心部件:网格发生器类负责区间切分与信号计算,仓位管理器实现分批建仓,事件监听器处理强制赎回等特殊事件。在技术实现上,主要覆盖init()初始化参数,next()处理网格信号生成,订单执行采用分批限价单模式。考虑到可转债流动性,还需加入滑点控制和冲击成本估算功能。对于资金管理,建议采用比例分配法避免单网格仓位过重。示例代码要突出可转债特性处理,比如在notify_trade方法中加入转股溢价率监控,在stop方法中设置强制赎回响应机制。回测模块需要特别配置可转债的交易手续费规则(通常低于股票),以及设置正确的日线复权方式(因频繁分红送转)。为了提升实用性,补充了四个关键优化方向:动态网格调节、波动率因子加成、混合止盈策略、转债事件过滤。用户若需要详细参数调优指导,可以进一步提供网格间距计算器或敏感性分析模板。</think> 以下是一个基于Backtrader实现的可转债网格交易策略示例代码及核心方法解析,结合可转债特性设计了分层交易逻辑: ```python import backtrader as bt class ConvertibleBondGridStrategy(bt.Strategy): params = ( ('grid_number', 5), # 网格层数 ('grid_spacing', 0.01), # 价格间隔比例 ('position_ratio', 0.2), # 每层仓位比例 ('conversion_price', 100) # 假设转股价 ) def __init__(self): # 关键参数初始化 self.grid_levels = [] # 网格价格层 self.current_level = None # 可转债特有参数 self.conversion_premium = 0.3 # 转股溢价率阈值 # 构建初始网格区间 self._build_grid() def _build_grid(self): """构建动态网格价格区间""" base_price = self.data.close[0] # 以当前价为中心 for i in range(-self.p.grid_number//2, self.p.grid_number//2+1): price_level = base_price * (1 + i * self.p.grid_spacing) self.grid_levels.append(round(price_level, 2)) print(f"网格初始化完成 | 层级价格: {self.grid_levels}") def next(self): current_price = self.data.close[0] # 可转债保护条件:避免高溢价时建仓 if current_price > self.p.conversion_price * (1 + self.conversion_premium): print(f"当前价格{current_price}高于安全阈值,暂停交易") return # 网格交易逻辑 new_level = min(self.grid_levels, key=lambda x: abs(x - current_price)) if new_level != self.current_level: # 首次进入网格 if self.current_level is None: self._enter_position(new_level) # 网格移动信号 elif (current_price > self.current_level and new_level > self.current_level) or \ (current_price < self.current_level and new_level < self.current_level): print(f"触发网格切换 | {self.current_level} -> {new_level}") self._grid_move(new_level) def _enter_position(self, level): """初始仓位建立""" target_size = self.broker.getvalue() * self.p.position_ratio self.order_target_percent(target=target_size) self.current_level = level print(f"初始建仓 | 价格:{level} | 仓位:{target_size}") def _grid_move(self, new_level): """网格移动时的仓位调整""" # 计算方向:价格上涨卖网,下跌买网 if new_level > self.current_level: # 卖出操作 sell_size = self.broker.getvalue() * self.p.position_ratio self.sell(size=sell_size) print(f"【网格卖出】| 触发价:{new_level} | 数量:{sell_size}") else: # 买入操作 buy_size = self.broker.getvalue() * self.p.position_ratio self.buy(size=buy_size) print(f"【网格买入】| 触发价:{new_level} | 数量:{buy_size}") self.current_level = new_level # 主回测引擎 if __name__ == '__main__': cerebro = bt.Cerebro() # 配置可转债数据集(需替换为真实数据) data = bt.feeds.GenericCSVData( dataname='bond_data.csv', dtformat=('%Y-%m-%d'), openinterest=-1 ) cerebro.adddata(data) # 策略参数配置 cerebro.addstrategy(ConvertibleBondGridStrategy, grid_number=7, grid_spacing=0.015) # 回测设置 cerebro.broker.setcash(100000) cerebro.broker.setcommission(commission=0.001) # 可转债佣金通常较低 print('起始资金: %.2f' % cerebro.broker.getvalue()) cerebro.run() print('最终资金: %.2f' % cerebro.broker.getvalue()) cerebro.plot() ``` ### 策略核心设计要点 1. **网格动态构建** - 以当前价格为中心扩展$N$层网格 - 网格间距使用百分比 `grid_spacing`(可设置为债券价格波动标准差) - 每层仓位按`position_ratio`比例分配 2. **可转债特性处理** - 转股溢价率监控:`conversion_premium` 防止高溢价买入 - 强制赎回规避:需在notify_trade事件中补充逻辑 - 波动率适配:可转债波动通常低于正股 3. **风险控制机制** ```python def notify_trade(self, trade): if trade.status == trade.Closed: profit = trade.pnlcomm # 单笔损失超过阈值暂停网格 if profit < -self.broker.getvalue() * 0.03: self.p.grid_spacing *= 1.2 # 自动扩大网格间距 ``` ### 策略优化方向 1. **动态网格优化** - 基于历史波动率调整网格密度:$\sigma_{adjusted} = \sqrt{\frac{1}{N}\sum_{i=1}^{N}(r_i-\bar{r})^2}$ - 布林带边界替代固定网格:上下轨 $\mu \pm k\sigma$ 2. **混合止盈策略** ```python def next(self): # 在网格移动中增加止盈逻辑 if self.position.size > 0: # 收益率超过阈值部分止盈 if self.data.close[0] / self.entry_price > 1.15: self.sell(size=self.position.size * 0.3) ``` 3. **转债特有事件处理** ```python def notify_corporate_event(self, event, **kwargs): # 响应强制赎回/转股事件 if event.type == 'CONVERSION': print("触发强制转股,清仓处理") self.close() ``` > 注:实际应用需结合[转股溢价率模型](https://www.sciencedirect.com/science/article/pii/S037842662200100X)调整网格参数[^1],完整实现应包含回售条款处理模块。建议先用模拟盘测试参数敏感性。 --- ### 相关问题拓展 1. **如何确定可转债网格的最佳密度?** - 建议统计品种历史价格分布$P(x)$,使网格间距$\Delta p$满足 $\int_{p_i}^{p_i+\Delta p} P(x)dx ≈ 0.25$ 2. **怎样处理可转债的转股溢价率突变?** - 建立溢价率监控线程,当$(\text{现价}/\text{转股价}-1) > \text{阈值}$时暂停网格买入 3. **Backtrader如何模拟可转债T+0交易?** - 在`DataFeed`中启用`T+0`模式:`cerebro.adddata(data, tzero=True)` - 设置当日平仓免手续费规则 4. **网格策略在单边行情如何避免亏损?** - 增加趋势过滤器:当50日均线斜率 $\frac{dMA}{dt} > \alpha$ 时暂停逆势建仓 - 采用移动网格机制:每10个交易日重置网格中心价 需要特定可转债的历史回测数据模板可参考[QStock可转债模块](https://github.com/mpquant/qstock)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网寻星

打赏老板,留下需求,为你而码

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值