经管之家App
让优质教育人人可得
立即打开
全部版块
我的主页
›
论坛
›
金融投资论坛 六区
›
金融学(理论版)
›
量化投资
基金最大回撤算例(Java 1.8)
楼主
clxering
3035
1
收藏
2016-04-17
1、测试数据源:长盛电子信息主题灵活配置混合(000063),2013-05-10~2016-04-15全部历史净值数据。
数据净值曲线:
2、写了三种方式做比较,Level1是参考了一些资料做的模版;Level2在前者基础上做了循环点的修改,将净值中所有下降沿的顶点和终点成对筛选出来,存为一个集合。经运行测试,Level1和Level2两者消耗时间相当;Level3将净值中所有下降沿的顶点值和终点值筛选出来,分别存为集合。当最大回撤出现在数据靠后位置时,减少了搜寻最低点的次数,此时Level3有一定优势。
3、主要代码如下:
class ValueSample
{
private static ArrayList<Double> valueCollection = new ArrayList<>();
// 净值集合
private static ArrayList<Double> maxCollection = new ArrayList<>();
// 下降趋势顶部索引集合
private static ArrayList<Double> minCollection = new ArrayList<>();
// 上升趋势底部索引集合
private static ArrayList<Integer> 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、测试时间(单位,毫微秒):
5、数据源xml,使用Navicat导出的MySQL数据表。(因不能上传xml文件,加了txt的后缀)
myFundValue.xml.txt
大小:(54.68 KB)
马上下载
附件列表
5.png
原图尺寸 9.4 KB
4.png
原图尺寸 9.47 KB
3.png
原图尺寸 9.42 KB
2.png
原图尺寸 9.39 KB
1.png
原图尺寸 9.43 KB
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
全部回复
沙发
hollyshiit
2016-5-3 11:13:38
👍,厉害,学习了。
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
相关推荐
Java与R语言通信总结
Java设计模式第2版
JAVA 经典算法大全:生命游戏
Java初学者必备 Java实用小抄
在java调用r的时候,为什么不识别汉字呀?求助~~~
求助 如何R和JAVA关联起来.
最常被问起的10个java集合问题
无法加载 Java 虚拟机
JAVA大神,求资料
java入门小知识
栏目导航
量化投资
爱问频道
经管文库(原现金交易版)
经管在职研
经管高考
真实世界经济学(含财经时事)
热门文章
CDA 数据分析师:线性回归实战指南 —— 从 ...
世界上最简单的会计书(高清pdf版)
AI应用新范式:从工具革命到“超级OS”的演 ...
20XX年扶贫办雨露计划工作方案
同心动力携手山西金控,共筑金融企业“以人 ...
R语言实战 机器学习与数据分
蔡定创教授、李云庆院长致联合国秘书长古特 ...
2022年北京冬奥会英语观后感【10篇】
R语言预测实战
瓦尔拉斯方程组及其求解历史
推荐文章
AI狂潮席卷学术圈,不会编程也能打造专属智 ...
最快1年拿证,学费不足5W!热门美国人工智能 ...
关于如何利用文献的若干建议
关于学术研究和论文发表的一些建议
关于科研中如何学习基础知识的一些建议 (一 ...
一个自编的经济学建模小案例 --写给授课本科 ...
AI智能体赋能教学改革: 全国AI教育教学应用 ...
2025中国AIoT产业全景图谱报告-406页
关于文献求助的一些建议
几种免费下载文献的方法----我的文献应助经
说点什么
分享
微信
QQ空间
QQ
微博
扫码加好友,拉您进群
各岗位、行业、专业交流群