债券付息日和兑付日计算

1.(1)业务场景

付息频率为 月/次 为单位   能拿到字段 起息日  到期日  需要计算出中间所有的付息兑付计划日期

(2)主要问题:

1>如果起息日为某月31号 遇到没有31号的月份需要取30号

2>如果起息日为30号 或者29号 遇到平年2月份需要取28号

(3)算法分析:

按 照付息频率 拿到每个付息月份可以用calendar类自带加法运算月份的方法 add(int field, int amount) ( 此方法取到的日期  假如起息日为某月30日  如果下一个计息月为2月 会给你自动取到最后一天28日  那么在for循环中再往下计算会都取到计息月份的28号)

calendar类自带可以取到一个月最后一天的方法 那么若是31号 则取到当月的最后一天

如果是30号或者29号 按照add方法计算出所有计息日期放入list  然后遍历list 将不是二月份的日期全部替换成30号或29号

(4)代码

[java] view plain copy

private List<String> awardInteDate(Long d1, Long d2,Long frequency) throws ParseException,
            java.text.ParseException {
        String str = d1.toString();
        List<String> list = new ArrayList<String>();
        //getMonthSpace()获得两个日期之间的月份数量
        for (int i = 0; i < InfordInteCalculateLogic.getMonthSpace(d1.toString(), d2.toString()) / frequency; i++) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            Date date = sdf.parse(str);
            Calendar ins = Calendar.getInstance();
            ins.setTime(date);
            ins.add(Calendar.MONTH,frequency.intValue());
            //yyyyMMdd格式的日期  取到日
            String s = d1.toString().substring(str.length() - 2, str.length());
            if ("31".equals(s)) {
                //如果是31号 取每个月最后一天
                ins.set(Calendar.DATE, ins.getActualMaximum(Calendar.DATE));
                str = sdf.format(ins.getTime()).toString();
                list.add(str);
            }
            else {
                str = sdf.format(ins.getTime()).toString();
                list.add(str);
            }  

        }  

        String ss = d1.toString().substring(str.length() - 2, str.length());
        //如果是30号  将list中除了2月份之外所有月份的日改为30号
        if ("30".equals(ss)) {
            for (int i = 0; i < list.size(); i++) {
                String str1 = list.get(i);
                if (!"02".equals(str1.substring(4, 6))) {
                    StringBuilder builder = new StringBuilder(str1);
                    builder.replace(6, 8, "30");
                    str1 = builder.toString();
                    list.set(i, str1);
                }
            }  

        }
        if ("29".equals(ss)) {
            for (int i = 0; i < list.size(); i++) {
                String str1 = list.get(i);
                if (!"02".equals(str1.substring(4, 6))) {
                    StringBuilder builder = new StringBuilder(str1);
                    builder.replace(6, 8, "29");
                    str1 = builder.toString();
                    list.set(i, str1);
                }
            }
        }
        return list;

[java] view plain copy

    // 计算两个日期之间月份数方法
        public static int getMonthSpace(String date1, String date2) throws ParseException,
                java.text.ParseException {  

            int result = 0;  

            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");  

            Calendar c1 = Calendar.getInstance();
            Calendar c2 = Calendar.getInstance();  

            c1.setTime(sdf.parse(date1));
            c2.setTime(sdf.parse(date2));  

            result = (c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR)) * 12
                    + (c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH));  

            return result == 0 ? 1 : Math.abs(result);  

        }  

—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——

2.(1)业务场景

1>非闰年计息年度确定

按照产品本身的生命周期确定其计息年度。如某附息债权融资计划,5年期,每三个月付息一次,起息日为2016年4月20日,则2016年7月20日
为第一个付息日,2016年10月20日为第二个付息日,那么2016年4月20日——2017年4月20日(利息计算算头不算尾,下同)为该产品的第一
个完整计息年度,该产品共5个计息年度。

2>闰年计息年度确定

闰年计息年度确定,以其一个完整的计息年度内是否跨越闰年中的2月29日为标准。仍以前款所举产品为例,因2020年2月处于该产品的2019年4月20
日至2020年4月20日这一计息年度内,所以该计息年度为闰年计息年度。因此,2019年在自然年度上虽不是闰年,但第四个计息期(2020年1月20
日——2020年4月20日)因属于该产品2019年4月20日——2020年4月20日这一计息年度,所以应按闰年处理。而2020年虽然是在自然年度
上是闰年,但其第五个计息年度(2020年4月20日——2021年4月20日)不是闰年计息年度,仍按非闰年处理。

(2)算法分析:

拿到 2个如期间所有的闰年 如果起息日是一个2月29号之后的时间 那么拼接前一年和当年为计息年度横跨的2年 将这两个年度放入数组

如果是一个2月29号之前的日期  那么拼接当年和后一年为计息年度横跨的2年 将这两个年度放入数组

如果付息计划时间 在这个数组list中任意一个数组中的两个时间跨度之内 那么代表在闰年计息年度中 flag+1 标记为闰年计息年度

(3)代码

[java] view plain copy

    //判断是否为闰年计息年度方法
    private int judgeLeapYearStyle(String date,String begin,String end){
        int i;
        List<Integer> list=new  ArrayList<Integer>();
        List<String []> arrList=new  ArrayList<String []>();
        for(i=Integer.parseInt(begin.substring(0, 4));i<=Integer.parseInt(end.substring(0, 4));i++){
          if((i%4==0&&i%100!=0)||(i%400==0)) {
              list.add(i);
          }
        }
        // 拿到 2个如期间所有的闰年 如果起息日是一个2月29号之后的时间 那么拼接前一年和当年为计息年度横跨的2年 将这两个年度放入数组
        // 如果是一个2月29号之前的日期  那么拼接当年和后一年为计息年度横跨的2年 将这两个年度放入数组
        // 如果付息计划时间 在这个数组list中任意一个数组中的两个时间跨度之内 那么代表在闰年计息年度中 flag+1 标记为闰年计息年度
        String monthDay;
        if("0".equals(begin.substring(4, 5))){
            monthDay=begin.substring(5, 8);
            if(Integer.parseInt(monthDay)>=229){
                for (Integer integer : list) {
                    String d1=String.valueOf(integer-1)+"0"+monthDay;
                    String d2=String.valueOf(integer)+"0"+monthDay;
                    String[] arr = new String []{d1,d2};
                    arrList.add(arr);
                }
            }else{
                for (Integer integer : list) {
                    String d1=String.valueOf(integer)+"0"+monthDay;
                    String d2=String.valueOf(integer+1)+"0"+monthDay;
                    String[] arr = new String []{d1,d2};
                    arrList.add(arr);
                }
            }
        }else{
            monthDay=begin.substring(4, 8);
            if(Integer.parseInt(monthDay)>=229){
                for (Integer integer : list) {
                    String d1=String.valueOf(integer-1)+monthDay;
                    String d2=String.valueOf(integer)+monthDay;
                    String[] arr = new String []{d1,d2};
                    arrList.add(arr);
                }
            }else{
                for (Integer integer : list) {
                    String d1=String.valueOf(integer)+"0"+monthDay;
                    String d2=String.valueOf(integer+1)+"0"+monthDay;
                    String[] arr = new String []{d1,d2};
                    arrList.add(arr);
                }
            }
        }
        int flag = 0;
        for (String[] strings : arrList) {
            if(Integer.parseInt(date)>=Integer.parseInt(strings[0]) && Integer.parseInt(date)<=Integer.parseInt(strings[1])){
                flag+=1;
            }
        }
        return flag;
    }  

浮息债的算法 计算方式会比这还要复杂很多。

时间: 2024-10-13 03:15:40

债券付息日和兑付日计算的相关文章

输入年、月、日计算是星期几

 /************************************************************************* 该程序功能: 1.输入年.月.日判断这天是星期几 2.打印出其中的闰年 3.计算从1600到输入时间,总共的天数 说明: 输入的年份必须大于1600 **************************************************************************/ #include <stdio.h> /

2015年4月30日 计算两个日期天数,目前为止写的最长的代码

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #define ISYEAR(year) (year%400==0) ||(year%4==0&&year%100!=0) 5 int DayofYear(int year, int month, int day); 6 7 8 int main(int argc, char *argv[]) 9 { 10 int year1

4月27日--28日课堂内容

语句 语句的分类 * 一.顺序语句 * 二.分支语句(选择语句) * 三.循环语句 二.选择语句(分支语句/条件语句)  if  else 1.定义 if是如果的意思,else是另外的意思,if后面跟()括号内为判断条件,如果符合条件则进入if语句执行命令.如果不符合则不进入if语句.else后不用加条件,但是必须与if配合使用,else后也可加if,但if后需要条件.If-else可以嵌套. 2.格式 (1)格式1: if (…) //括号内是判断条件 { //程序代码,运算等等 } (2)格

债券的结算方式

债券交易双方在全国银行间债券市场进行交易后,进行结算时可以采用款券对付.见券付款.见款付券三种结算方式,说的通俗点就是 款券对付:一手交钱,一手付券,同时完成:见券付款:卖家先将债券划给买方,买方再把款划给卖方:见款付券和见券付款相反:买家先将款划给卖方,卖方再把券给买方.三种方式中,款券对付最合理,双方都没有风险,现在在银行间市场中强制要求所有的交易都采用款券对付的结算方式,下面就主要介绍一下券款对付的结算方式. 券款对付是指在结算日债券与资金同步进行结算并互为结算条件的方式,国际证券业称其为

二周第五次课(12月22日)

二周第五次课(12月22日)2.23/find命令2.24/find命令2.25/ find命令2.26 文件名后缀 其他搜索文件命令: · which搜索文件是从环境变量PATH里找的 · whereis在事先准备好的库里搜索 ·  locate需要安装mlocate包,之后使用updatedb命令生成一下文件列表路径数据库,然后才能搜索. 快捷键: ctrl + l清屏 crtl + d 退出终端 ctrl + c 终止运行或暂停 crtl +u 删除光标前面所有的 crtl + e光标挪到

读《证券市场基础知识》(2012)-1 [概念篇]

2016.04.12 – 04. 读<证券市场基础知识>(2012)的个人笔记.笔记书中大部分术语的概念,以取得对这些术语的感性理解.对于书中部分未解释的术语,询问度娘并笔记在此. 1 证券市场概述 1.1 证券与证券市场 04.13 证券 证券是法律凭证.用来证明证券持有人享有证券所记载内容的特定权益. [1] 有价证券 有价证券 有价证券是指标有票面金额,用于证明持有人或该证券指定的特定主体对特定财产拥有所有权或债权的法律凭证. [债权] 债权是得请求他人为一定行为(作为或不作为)的民法上

基金押题卷二

一 单选 (1)在半强式有效的股票市场中,某新技术公司正在进行一种新型芯片的检验,这项工作可以大幅度提高工作效率,在公司公开宣布实施这项技术之前,该公司技术总监事先购买本公司股票,他赚取利润的概率(). A0 B50% C100% D无法预测 题    型:常识题 页    码:304 难 易 度:易 专家答案:C解析内容 在半强势有效市场中,通过内幕消息可以100%获取利润. (2)一般来说,ETF的特点不包括( ). A招募说明书中明确规定了相关的担保条款 B被动操作的指数基金 C实物申购.

模拟2-基金

u 单选题 我国第一只开放式基金是().C A:基金开元 B:基金金泰 C:华安创新 D:南方宝元 页码:17:解析:我国第一只开放式基金是华安创新. 经中国证监会批准可以在境内募集资金进行境外证券投资的机构被称为().A A:合格境内机构投资者 B:合格境外机构投资者 C:合格境内.外机构投资者 D:合格机构投资者 页码:53:解析:在境内募集资金可以进行境外证券投资的机构就被称为合格境内机构投资者. 以下关于资本资产定价模型(CAPM)的表述,错误的是().A A:假设投资者都是追求利益同时

find命令参数及其详解

find find 功能说明:查找文件或目录. 语 法:find [目录...][-amin <分钟>][-anewer <参考文件或目录>][-atime <24小时数>][-cmin <分钟>][-cnewer <参考文件或目录>][-ctime <24小时数>][-daystart][-depyh][-empty][-exec <执行指令>][-false][-fls <列表文件>][-follow][-