mysql中计算最大回撤_基金最大回撤算例(Java 1.8)
1、测试数据源:长盛电子信息主题灵活配置混合(000063),2013-05-10~2016-04-15全部历史净值数据。数据净值曲线:
2016-4-17 18:26:30 上传
下载附件 (16.76 KB)2、写了三种方式做比较,Level1是参考了一些资料做的模版;Level2在前者基础上做了循环点的修改,将净值中所有下降沿的顶点和终点成对筛选出来,存为一个集合。经运行测试,Level1和Level2两者消耗时间相当;Level3将净值中所有下降沿的顶点值和终点值筛选出来,分别存为集合。当最大回撤出现在数据靠后位置时,减少了搜寻最低点的次数,此时Level3有一定优势。
3、主要代码如下:class ValueSample
{
private static ArrayList valueCollection = new ArrayList<>();// 净值集合
private static ArrayList maxCollection = new ArrayList<>();// 下降趋势顶部索引集合
private static ArrayList minCollection = new ArrayList<>();// 上升趋势底部索引集合
private static ArrayList IndexCollection = new ArrayList<>();// 趋势点索引集合
public static void main(String[] args)
{
//.....此处省略导入净值到valueCollection的过程。
// 最大回撤,Level1
long start = System.nanoTime();
System.out.println("L1最大回撤=" + getMaxDrawdownLevel1());
long end = System.nanoTime();
System.out.println("L1用时:" + (end - start));
Thread.sleep(3000);//暂停3s
// 最大回撤,Level2
start = System.nanoTime();
indexInitialize();
System.out.println("L2最大回撤=" + getMaxDrawdownLevel2());
end = System.nanoTime();
System.out.println("L2用时:" + (end - start));
Thread.sleep(3000);
// 最大回撤,Level3
start = System.nanoTime();
valueInitialize();
System.out.println("L3最大回撤=" + getMaxDrawdownLevel3());
end = System.nanoTime();
System.out.println("L3用时:" + (end - start));
}
private static double getMaxDrawdownLevel1()// 最大回撤L1
{
double diff = 0;
double max = valueCollection.get(0);
for (int temp = 1; temp < valueCollection.size(); temp++)
{
if (valueCollection.get(temp) - max < diff)
diff = valueCollection.get(temp) - max;
if (valueCollection.get(temp) > max)
max = valueCollection.get(temp);
}
System.out.println("最大回撤率max=" + (diff / max) * 100);
return diff;
}
private static double getMaxDrawdownLevel2()// 最大回撤L2
{
double diff = 0;
double max = valueCollection.get(IndexCollection.get(0));
for (int baseIndex = 1; baseIndex < IndexCollection.size(); baseIndex++)
{
if (valueCollection.get(IndexCollection.get(baseIndex)) - max < diff)
diff = valueCollection.get(IndexCollection.get(baseIndex)) - max;
if (valueCollection.get(IndexCollection.get(baseIndex)) > max)
max = valueCollection.get(IndexCollection.get(baseIndex));
}
System.out.println("最大回撤率max=" + (diff / max) * 100);
return diff;
}
private static double getMaxDrawdownLevel3()// 最大回撤L3
{
double max = maxCollection.get(0);
int maxIndex = 0;
for (int baseIndex = 1; baseIndex < maxCollection.size(); baseIndex++)
if (max < maxCollection.get(baseIndex))
{
max = maxCollection.get(baseIndex);
maxIndex = baseIndex;
}
double min = minCollection.get(maxIndex + 1);
for (int baseIndex = maxIndex + 2; baseIndex < minCollection.size(); baseIndex++)
if (min > minCollection.get(baseIndex))
min = minCollection.get(baseIndex);
System.out.println("最大回撤率max=" + (min / max - 1) * 100);
return min - max;
}
private static void valueInitialize()// 初始化趋势点值集合
{
for (int baseIndex = 0; baseIndex < valueCollection.size() - 1; baseIndex++)
if (valueCollection.get(baseIndex) > valueCollection.get(baseIndex + 1))
{
maxCollection.add(valueCollection.get(baseIndex));// 加入下降趋势顶部值
for (; baseIndex + 1 < valueCollection.size(); baseIndex++)
if (valueCollection.get(baseIndex) < valueCollection.get(baseIndex + 1))
{
minCollection.add(valueCollection.get(baseIndex));// 加入上升趋势底部值
break;
}
}
}
private static void indexInitialize()// 初始化趋势点索引集合
{
for (int baseIndex = 0; baseIndex < valueCollection.size() - 1; baseIndex++)
if (valueCollection.get(baseIndex) > valueCollection.get(baseIndex + 1))
{
IndexCollection.add(baseIndex);// 加入下降趋势顶部索引
for (; baseIndex + 1 < valueCollection.size(); baseIndex++)
if (valueCollection.get(baseIndex) < valueCollection.get(baseIndex + 1))
{
IndexCollection.add(baseIndex);// 成对加入上升趋势底部索引
break;
}
}
}
}
4、测试时间(单位,毫微秒):
2016-4-17 18:24:45 上传
下载附件 (7.43 KB)
2016-4-17 18:24:44 上传
下载附件 (7.41 KB)
2016-4-17 18:24:43 上传
下载附件 (7.37 KB)
2016-4-17 18:24:42 上传
下载附件 (7.36 KB)
2016-4-17 18:24:33 上传
下载附件 (7.4 KB)
5、数据源xml,使用Navicat导出的MySQL数据表。(因不能上传xml文件,加了txt的后缀)
2016-4-17 18:33:36 上传
长盛电子信息主题灵活配置混合(000063)历史数据
mysql中计算最大回撤_基金最大回撤算例(Java 1.8)相关推荐
- mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法
mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 说明: ...
- mysql节假日函数_如何在MySQL中计算不包括周末和节假日的日期差
我需要计算两个日期之间的天数(工作日),不包括周末(最重要)和假期 SELECT DATEDIFF(end_date, start_date) from accounts 但是,我不知道该如何在MyS ...
- mysql 税率用什么类型_在MySQL中计算增值税/税金总额 - 增值税税率取决于地点字段...
我正在尝试在MySQL中创建一个报告(来自Wordpress / Woocommerce安装中的表格,但这个商店征税的方式与Woocommerce的工作方式不同,所以我不能使用Woocommerce报 ...
- mysql中日期怎样求差_在Sql语句中怎样计算出两个日期的差值
展开全部 sql语句中计算两个日期的差值用32313133353236313431303231363533e4b893e5b19e31333365643662datediff函数. 工具:sqlser ...
- md5后得到的32位字符串存储到mysql中太占空间了_好看!快收藏:非常完整的 MySQL 规范...
一.数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名 ...
- mysql中的索引什么意思_索引是什么意思(数据库中的索引是什么)
mysql中索引是存储引擎层面用于快速查询找到记录的一种数据结构,索引对性能的影响非常重要,特别是表中数据量很大的时候,正确的索引会极大的提成查询效率.简单理解索引,就相当于一本砖头厚书的目录部分,通 ...
- mysql中sysdate函数转字符串_【转】MySQL:日期函数、时间函数总结(MySQL 5.X)
转自:http://www.cnblogs.com/she27/articles/1377089.html 一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time) ...
- md5后得到的32位字符串存储到mysql中太占空间了_面试官:你对MySQL高性能优化有什么规范建议?...
推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少? 文章篇幅较长,建议先收藏再找个合适的时间阅读 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 ...
- mysql中获取时间的年月日_详解mysql 获取当前日期及格式化
MySQL 获取当前日期及日期格式 获取系统日期: NOW() 格式化日期: DATE_FORMAT(date, format) 注: date:时间字段 format:日期格式 返回系统日期,输出 ...
最新文章
- 在python中调用js或者nodejs要使用PyExecJs第三方包。
- 用计算机算出你喜欢吃你喜欢的人,Go for it七年级下学期1-12单元(期末复习)句子翻译专练...
- 国外的程序猿可以工作到退休而国内的为什么这么短命(思维认知)
- openssh arm linux 编译,openssh编译安装到ARM嵌入式系统中
- 理论基础 —— 线性表 —— 单链表
- 2019年的流水账和总结
- linux怎么添加DSL,如何在redhat上进行DSL 拨号
- 车牌识别算法_向滥用远光灯说不,易泊车牌识别算法了解一下?
- 基于JSP+Servlet+Tomcat8.5+WebSocket实现的网页聊天室
- 苹果亮度自动调节怎么关闭_为何安卓自动亮度调节做不好?小米张国全释疑
- 如何有效的获得高质量的大规模标注数据?
- 旁门左道:让移动游戏在APP Store下载量暴涨的邪门功夫
- MOTO不相信眼泪!艰难回归!你,准备好了吗?
- 你该知道的Pyecharts简易上手教程
- 获取指定区域内的坐标点位,在线查看经纬坐标
- 绿地五里桥 设计原型_绿地 · 黄浦滨江项目设计
- 关于“发现在互联网状态下的生活时间流逝很快的分析”
- 论文阅读笔记:看完也许能进一步了解Batch Normalization
- 异常被 ”吃“ 掉导致事务无法回滚
- SAP中总账科目事务FS00/FSP0/FSS0的关系和区别