信息比率 夏普比率率和最大回撤到底怎么计算

绝对收益类基金怎么选?夏普比率很重要
您现在的位置:&&>>&&>>&&>>&正文
绝对收益类基金怎么选?夏普比率很重要
可能这是每位投资者最为苦恼的“投资阶段”——不敢碰频频暴跌的股票市场、固定收益类产品收益率正在下滑、P2P跑路太多也不敢投,但是生活成本继续走高的压力山大。 量化对冲型产品在这个阶段脱颖而出,据悉已经有不少机构投资者开始积极布局,这类产品或许能满足投资者“对年化收益率10%、风险偏低”的理财渴求。门槛低、运作透明的公募绝对收益类基金是普通小散们最好的帮手。 然而,一谈起对冲、量化等词汇,投资者顿觉高大上,这些“不明觉厉”的产品其实有几个关键之处理解了,小白们都可以做足投资。 据理财君统计,目前公募系,可以对冲的绝对收益类产品约10只,今年以来平均收益率超12%,最大回撤不过4%。相对来说,这类产品风险收益比要好于债券型基金,但投资者也要注意过往业绩不代表未来,最好通过夏普比率看产品。绝对收益基金 走市场中性路公募系绝对收益类产品,最早出现是2013年底的嘉实基金绝对收益策略基金,是一批通过股指期货做对冲、追求绝对收益产品。综合来看,这类基金往往有三大特点,第一是基本采取市场中性策略;第二是发起式基金,基金公司自购1000万且持有期限不低于3年,和持有人利益捆绑;第三是业绩比较基准除工银瑞信绝对收益是“一年定存+3%”、南方绝对收益策略为“一年定存+2%”外,其他多数是“一年期定期存款基准利率”。小白们,不妨从这三大特点出发去真正理解这一类产品。第一也是最重要的,什么是市场中性策略?用教科书解释是,市场中性策略是指同时构建多头和空头头寸以对冲市场风险,在市场不论上涨或者下跌的环境下均能获得稳定收益的一种投资策略,市场中性策略主要依据统计套利的量化分析。深圳一家基金公司量化投资部总监就对记者表示,用简单的话来说,市场中性策略,就是当用100元买股票做多时,也用100元做空,做空和做多的市值差不多,这样完全是中性平衡的,隔离了市场风险。这样就出现另一个疑问,既然一手做多一手做空且基本两边基本平等,那么怎么赚钱呢?主要是通过选股赚取超越市场的收益来赚钱,也就是非常书面化的阿尔法策略。目前来看,公募基金中采取市场中性策略基金选股方式有两种,一种是主动选股,另一种是量化选股,同样是希望选择股票能赚取超越市场的阿尔法。这两者间难有好坏之分,只能通过较长时间业绩来看哪一只更有优秀。除了个股超额收益外,广发绝对收益类基金还表示,的收益来源于还来源于期货基差收益,每年为3%左右;以及股票分红收益,每年约为1%。这两块收益较为固定。正确理解风险和收益曾经有一家基金公司做过7年数据统计,这类绝对收益类产品过去7年的年化收益率约为18%,最大回撤为4%左右。从产品宣传上看,也常常有类似有吸引力的历史数据。采取量化对冲的绝对收益类产品这么强悍么?从今年业绩来看,这类产品确实很厉害。2015年之前成立的6只产品来看,今年平均收益率为12.47%,最大回撤为4.4.6%。而从全体产品看,嘉实绝对收益策略、海富通阿尔法对冲、南方绝对收益策略、广发对冲套利,收益率分别达到17.89%、17.35%、12.86%、12.6%。若按照年化收益率算,今年这类产品表现非常突出。更重要的是,在市场多次跌幅超过7%以上的日子里,这些量化对冲的绝对收益产品最大跌幅不过0.5%,要明显好于大盘。甚至有时候市场大跌,这些基金还出现微幅上涨,南方绝对收益策略在今年以来的多次大幅调整中净值增长率都为正,抗跌力十足。是不是会一直这么完美呢?其实从这类产品成立以来收益率可以看出端倪,2015年之前成立的,成立以来收益率仅为13.17%,和今年以来平均收益率差距很少。上述量化投资部总监就指出,历史数据仅代表过往不代表未来。若过去10年年化收益率为10%,也往往是10年平均概念,并非每年都能达到10%,也存在“大年”、“小年”之别,投资者布局不要盲目。该量化投资部总监进一步解释,量化对冲所赚钱的是市场“广度”的钱,而主动选股投资是赚“深度”的钱。比如目前A股市场近3000只股票,而主动投资靠对公司、行业、市场深入理解去赚取阿尔法,比如对看好的股票持有比例很高;而量化投资则是根据过去市场情况选择有效策略通过量化模式去筛选股票,往往选出股票比较多,达到一两百只,平均下来可能有优势,赚取“广度”的钱。比如今年就是量化的大年,市场有足够的广度,而在震荡市或者单边市,往往广度不够,可能量化型产品就会受影响。另需要指出的是,量化月度胜率一般是70%,但是也不能保证年化收益率是正的,分布收益率不均。该量化投资部总监就强调,所有投资就是不确定性的,不能用过往数据来看将来,只能说,若和过去市场情况较为一致,大概率是可以做到上述收益。投资者也需要明确。筛选重点是什么? 夏普比率要关注和一般的基金不一样,布局绝对收益类基金需要注意的是夏普比率。什么是夏普比率?威廉·夏普提出,且他还获得了诺比尔经济学奖。过去往往只看收益率而忽视风险,夏普比率在现代投资理论的研究表明,风险的大小在决定组合的表现上具有基础性的作用。因此夏普比率就等于收益率/风险。风险如何量化?这采取的是产品净值的波动率。举一个例子,比如说两只产品,都是年化收益率10%,但是一只上半年跌了40%,下半年涨了70%;而另一只产品从来没有亏损,只是每天涨幅小。后者可能对投资者来说更好,它的夏普比率就很高。该量化投资部总监表示,美国市场经验看,过去10年若夏普比率为2,就是超级明星基金,处于1.5~2间也是不错产品,平均为1也还行。国内这类基金的时间较短,其实今年不少基金夏普比例超过3,但还需要时间去验证。“其实也很简单去看,比如说收益率为5%,那么净值波动率就不能超过5%,不然就小于1。”此外,投资者也可以关注最大回撤概念。什么是最大回撤?就是在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。通俗点讲,最大回撤用来描述买入产品后可能出现的最糟糕的情况。因此最大回撤越低越好。数据显示,今年以来这些量化对冲的绝对收益类产品最大回撤最高4%左右,从历史看,这类产品最大回撤出现在去年12月份,曾经一度超过6%,值得关注。但是相对股票型产品,回撤幅度比较有限,投资者可以综合考虑。小细节也要注意在了解这类产品风险特征之后,一些小细节也需要注意。第一是申购赎回,目前绝对收益类基金分为两类,一类是每个季度开放申购赎回,另一类是每天可以申购赎回,前者目前占据主流。相对来说,每个季度开放申购赎回,对于运作更为有利,但是每日开放申购赎回则流动性更好,投资者可以根据自己需求认购。若是选择季度打开申购赎回的产品,一定要注意和自己资金需求相匹配。第二,这些产品,管理费率一般为1%~1.5%,中金绝对收益策略、广发对冲套利、南方绝对收益策略、华宝兴业量化对冲、嘉实对冲套利、嘉实绝对收益策略相对来说较低,为1%,值得关注。第三,需要指出的是,这类产品更适合稳健型投资者。一个数据显示,过去10年历史看,量化对冲类产品风险收益比要好于固定收益类产品。需要指出的是,因为股指期货的历史没有10年,这是一个回测的结果。据理财君了解,目前机构投资者和高净值客户是申购这类量化对冲的产品大户。据一位卖方研究员表示,绝对收益率策略严格对冲系统风险,这类产品无论是最大净值回撤还是年化波动率,均低于传统偏股基金和沪深 300 指数。这类产品风险收益水平介于债券基金和混合基金之间,较为适合风险承受能力较为有限,同时希望无论股指涨跌都能获取一定收益的投资者。关注理财圈微信公众号,帮你赚钱!微信扫描下面二维码可立刻关注!
您还在为选股而苦恼吗? 请免费下载最新推出的《操盘软件富赢版V7》试用。《操盘软件富赢版V7》在原有软件版本的基础上增加了大量新功能,并内置选股方案,让选股更加容易。新增加个股短线操盘,中线操盘提示,让您安全获利。软件免费下载地址:
客服QQ:  2995089 
      
免责声明:湖北省速马科技有限责任公司版权所有。本网站提供之资料或信息,仅供投资者参考,不构成投资建议。股市有风险,入市须谨慎!
Copyright 2011, Hubei Smart Technology Co,Ltd. All rights reserved.
联系电话:400-690-9926 E-MAIL: 鄂公网安备26号夏普比率和最大回撤到底怎么计算?
我知道公式是怎么回事。。。如题,我给一个极端例子,三个交易日。我九月一日一大早进场,带了100万,九月1号亏了99万9千9百9十9。九月二号一大早我就剩1块钱了,二号赚了一块钱,变成了两块。九月三号我又赚了一块钱,变成了三块。九月三号收盘时决定退市。上面一个极端情况,最大回撤和夏普比率怎么算?感谢各位高手指导我这个入门者。。。
按时间排序
最大回撤最大回撤就是从一个高点到一个低点最大的下跌幅度,用来描述我们的策略可能出现的最糟糕的情况,衡量了最极端可能的亏损。例如一个策略的最大回撤是50%,那么你使用这个策略之前就要掂量掂量,自己是否能经受得起50%的下跌。计算公式为:min(账户当日价值 / 当日之前账户最高价值-1)。夏普比率理性的投资者将选择并持有有效的投资组合,即那些在给定的风险水平下使期望回报最大的投资组合,夏普比率就是一个可以同时对收益与风险加以综合考虑的经典指标,表示每承受一单位风险,会产生多少的超额回报。计算公式为:(账户年化收益率-无风险利率)/ 收益波动率。贝塔(beta)值根据经典的资本资产定价理论(CAPM模型),β系数衡量了资产的回报率对市场变动的敏感程度,代表了该资产的系统性风险,表示策略对大盘的敏感性。计算公式为:账户日收益与参考基准日收益的协方差 / 基准日收益的方差。阿尔法(alpha)值虽然我们的策略会受到大盘的影响,但是每个策略都会有自己市场因素之外的收益,alpha值表示实际风险回报和平均预期风险回报的差额,衡量了投资的非系统性风险。计算公式为:(账户年化收益-无风险收益)-beta*(参考基准年化收益-无风险收益)。年化收益(按照复利计算)任何收益都应该转换成年化收益,以进行比较。股神巴菲特投资几十年以来的年化收益是20%左右。美国股市百年来年化收益大概是10%左右。计算公式为:(账户最终价值/账户初始价值)^(250/回测期间总天数)-1
你的迷惑主要来自于收益率怎么算吧。如果按投资期两端相减再年化,结果是-1。如果日收益年化,那就是(-1+1+0.5)/3的年化,这样是正的。依我看应该按后者来,前者的计算方法平滑掉了波动率偏差。和Ito积分里面的情况有点像。要看什么类型的策略,假如买期权,一天亏完是有可能的,但是一天赚翻倍也是有的。要是你的信号亏完第一次,赚翻倍10次,还是好信号。(当然亏完是资金分配和止损不对,不过信号是好信号)
详细可见Annualized Returns: 策略年化收益率。表示投资期限为一年的预期收益率。具体计算方式为 (策略最终价值 / 策略初始价值 - 1) / 回测交易日数量 × 250Benchmark Returns:参考标准年化收益率。具体计算方式为 (参考标准最终指数 / 参考标准初始指数 - 1) / 回测交易日数量 × 250 。Alpha:阿尔法。具体计算方式为 (策略年化收益 - 无风险收益) - beta × (参考标准年化收益 - 无风险收益),这里的无风险收益指的是中国固定利率国债收益率曲线上10年期国债的年化到期收益率。Beta:贝塔。具体计算方法为 策略每日收益与参考标准每日收益的协方差 / 参考标准每日收益的方差 。Sharpe Ratio:夏普比率。表示每承受一单位总风险,会产生多少的超额报酬。具体计算方法为 (策略年化收益率 - 回测起始交易日的无风险利率) / 策略收益波动率 。Volatility:策略收益波动率。用来测量资产的风险性。具体计算方法为 策略每日收益的年化标准差 。Information Ratio:信息比率。衡量超额风险带来的超额收益。具体计算方法为 (策略每日收益 - 参考标准每日收益)的年化均值 / 年化标准差 。Max Drawdown:最大回撤。描述策略可能出现的最糟糕的情况。具体计算方法为 max(1 - 策略当日价值 / 当日之前虚拟账户最高价值)
sharpe就每天受益平均下除以std啊最大回撤就是最低点除以之前的最高减去1啊
已有帐号?
无法登录?
社交帐号登录jekyll_zhou@126
deeplearning.net/software/theano/install_windows.html#install-windows1、Installation of Theano on Windows
3、安装pymc3:pip install git+/njsmith/scikits-sparse.git
4、conda install mingw libpython
Annualized Returns: 策略年化收益率。表示投资期限为一年的预期收益率。具体计算方式为 (策略最终价值 / 策略初始价值 - 1) / 回测交易日数量 & 250
Benchmark Returns:参考标准年化收益率。具体计算方式为 (参考标准最终指数 / 参考标准初始指数 - 1) / 回测交易日数量 & 250 。
Alpha:阿尔法。具体计算方式为 (策略年化收益 - 无风险收益) - beta & (参考标准年化收益 - 无风险收益),这里的无风险收益指的是中国固定利率国债收益率曲线上10年期国债的年化到期收益率。
Beta:贝塔。具体计算方法为 策略每日收益与参考标准每日收益的协方差 / 参考标准每日收益的方差 。
Sharpe Ratio:夏普比率。表示每承受一单位总风险,会产生多少的超额报酬。具体计算方法为 (策略年化收益率 - 回测起始交易日的无风险利率) / 策略收益波动率 。
Volatility:策略收益波动率。用来测量资产的风险性。具体计算方法为 策略每日收益的年化标准差 。
Information Ratio:信息比率。衡量超额风险带来的超额收益。具体计算方法为 (策略每日收益 - 参考标准每日收益)的年化均值 / 年化标准差 。
Max Drawdown:最大回撤。描述策略可能出现的最糟糕的情况。具体计算方法为 max(1 - 策略当日价值 / 当日之前虚拟账户最高价值)
作者:薛昆Kelvin
链接:/question//answer/
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
首先感谢雪球@进化论一平的分享:
*“投资的钟摆理论的实战应用”
*“从盲人摸象到博采众长---论投资的钟摆理论”
帖子内容主要包括:
1)钟摆理论介绍
2)钟摆实战应用方法
3)钟摆量化模型实现
4)回测结果及总结分析
5)钟摆策略源代码展示
请各位大神多多指导!1.钟摆理论介绍
如下图所示,从宏观角度说,价值投资者在寻找一个目标价(目标价即钟摆模型的最低点),我们假设在目标价的左侧价格是低估的,在右侧价格是高估的,价值投资者喜欢在左侧买入,然后等待价格到达其目标价之后卖出。而趋势投资者则在这个圆弧上寻找趋势运行的方向,以及捕捉趋势加速的进入时机(钟摆的最低点,即有效价格区间钟摆的瞬时速度最快),然后顺势持有,直到趋势彻底扭转。
可见,价值投资是价格无效到有效的宏观表现;而趋势投资很好的体现了市场低估时和高估时人的悲观与乐观情绪。也就是说,钟摆模型体现出了市场是一个理性(表现为价格有效性)与情绪(表现为趋势)共存的复合体。
那么在实际中我们要怎么操作呢?2.钟摆理论的实战应用方法
简单来说其核心思想是:
(1)从买入操作来看:通过找到有效价格区间,要求在价格低估时买入,但这同时又要满足另一个条件,那就是趋势必须向上。二者缺一不可。
(2)从卖出操作来看:必须顺势而为,在价格超过有效价格区间以后,如果趋势不变,不要急于卖出,直到趋势改变,价格高估再卖出。二者同样缺一不可。
那么,问题就来了,来了,来了。。。
1)钟摆理论的有效价格区间,也就是个股低估高估区间怎么找?
对于有效价格区间,@进化论一平的提出最好的参考就是所谓的历史PE区间带。什么意思呢?这里我理解为就是统计个股历史PE,找到分位数,低于某个分位数(比如20%)时即为低估,高于某分位数(比如80%)时即为高估。当然,大家可以使用其他价值投资方法。
2)怎么判断趋势?
这里我使用均线策略,短期移动平均线从下向上突破中长期移动平均线,形成黄金交叉,此时买入;短期移动平均线从上向下跌破中长期移动平均线均线策略,形成死叉,此时卖出。
3.钟摆理论的量化模型实现
为方便解读钟摆理论的量化模型程序,具体介绍如下:
使用研究模块获取股票池的历史PE数据(程序中取的是-),写入文件中
导入研究模型写出的文件,获取历史PE数据(这么做一是为了使股票在回测开始时就有PE数据,也可以加快回测速度)注:这里研究获取的历史PE数据需要与回测的起始时间连接上(所以这里回测设为)
进行回测。回测的伪码
(1)数据处理
(2)买卖条件部分if 股票低估 and 股票金叉: 标记为1,可买入 elif 股票高估 and 股票死叉: 标记为-1,可卖出
(3)资金管理部分if 坑满了并且有符合买入条件的股票: 剔除坑中持有的收益排名靠后的g.num_of_change支股票,买入备选池中收益率排名靠前的g.num_of_change支股票。 elif 坑没满: if 备选股票池中的股票数量小于可买的股票,则全部买入 if 备选池的股票大于可买数量,则按照收益率买入
(4)回测中股票池选取得是行业龙头股,如下图所示4.回测结果及总结分析
为了测试钟摆的效果,下面将钟摆与均线策略进行了比较,均线回测源码可以参考我上一篇帖子参数均选取为 #长短均线的间隔 g.shortMA=1 g.longMA=60 #持仓持有股票数量的最大上限 g.numHoldmax=10 # 坑满时每次调仓量 g.num_of_change=3 #设置计算几日收益率 g.period=10
回测可以发现,这种钟摆理论投资体系在回测时间段的回撤大大减少了,躲过了股灾,并获得了可观利润。5.钟摆策略源代码展示
把策略源码分享给大家,可以修改不同参数。程序写的不好,这里做几点说明:1.为了加快回测速度,我使用研究模块获取历史数据然后再回测里面调用,大大加快了回测速度。而且研究中尝试方法比较方便,很好用。
2.需要先运行研究模块程序获取股票池的历史PE数据(程序中取的是-),写入文件中(运行研究中的前三个代码块就可以了)。然后再运行回测,这里研究获取的历史PE数据需要与回测的起始时间连接上(所以这里回测设为)。
3.这样做不是很方便,有待修改,各位大神能否提个修改方案呢。
data=DataAPI.MktEqudGet(ticker=&600030&,beginDate=&&) & &#选取600030股票
a = data.closePrice
n = len(a)
for i in range(10, n):
& & x5 = a[i-5:i].mean() & & & & & & & & #5日均线值
& & x10 = a[i-10:i].mean() & & & & & & & #10日均线值
& & B.append(x5 & x10)
import matplotlib.pyplot as plt
o = data.openPrice
m = len(B)
w = 0 & & & & & & & & & #利润
cash = 1000000 & & & & &#操作金额1亿,但考虑买的份额为100的整数,取1百万
amount = 0
& & & & & &&
PL = [] & & & & & & &#利润w的数组
for i in range(1, m):
& & k = i + 10
& & if B[i-1] == 0 and B[i] == 1 and not amount: & & & & & &
& & & & amount = cash // o[k] & & #买入份额
& & & & cash -= o[k] * amount
& & elif B[i-1] == 1 and B[i]==0 and amount:
& & & & cash += o[k] * amount & & &#卖出的金额
& & & & amount = 0
# & & print cash, amount
& & PL.append(cash + o[k] * amount)
print(&利润:{}&.format(PL[-1]))
plt.plot(PL,color=&green&,label=&Profit and Loss&)
plt.xlabel(&Date&)
plt.ylabel(&Price&)
plt.show()
plt.plot(a[10:], color=&red&,label=&Profit and Loss&)
plt.show()
&''yyyymmdd to datetime''
&def toDay(ori):
& & &year=ori/10000
& & &month=(ori-year*1
& & &day=ori-month*100-year*10000
& & &return datetime.datetime(year,month,day)
word2010不能保存,另存为也不好用时,按照如下步骤更改设置:
  第一步,打开一个word2010文档;
  第二步,点击“文件”→“选项”按钮;
  第三步,在出现的对话框中,点击‘保存’选项,在保存格式选框中,选择一个文件格式,如word文档(*.docx),然后再点击“加载项”选项,如下图所示
  第四步,点击“com”加载项→将“Acrobat PDFMaker Office COM Addin”、“Microsof Word 稿纸向导加载项&、“Microsof Word 书法加载项”前面的钩去掉;
  第五步,保存设置,关闭文档;
  第六步,重新打开文件,再编辑后就可以保存了。
//grant select on tablename to otheruser
create synonym prdstock.qdata_windQuotation_subId &for prdqdata.qdata_windQuotation_subId
1、下载pyql:pyql-master.zip
/enthought/pyql
2、下载QuantLib:我目前用的是1.4.1。QuantLib-1.4.1.zip
http://sourceforge.net/projects/quantlib/files/QuantLib/
3、编译QuantLib,注意,只能用VS2008,且要编译成64位的。注意,VS2008默认没装64位的编译,需加装,如下图:
&&&&&&&&&&&&&&&&&&&&&&
编译的时候,按照pyql/docs/source/getting_started.rst的说明做,需注意:
& & & & & & & &boost我用的是boost_1_57_0
e. Patch ql/settings.py其实是settings.hpp
g这一步,除了改input_directory和output_file之外,注意把nm命令放到path,否则报错
& & & & &i这步拷贝到pyql/dll 或者pyql根下都可
从http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyqt下载安装即可
5、安装pyql,修改setup.py要注意:
需要注释掉test_extension相关类容(139-142,198),QuantLib代码有问题
97行修改为(否则只能编译成32位):& & & & args = ['/subsystem:windows']
修改49、50、55、56为相关类容
最后执行如下脚本,一切搞定:
python setup.py build_ext
python setup.py install
Java的GC机制是自动进行的,和c语言有些区别需要程序员自己保证内存的使用和回收。
Java的内存分配和回收也主要在Java的堆上进行的,Java的堆中存储了大量的对象实例,所以Java的堆也叫GC堆。
Java在垃圾收集的过程中,主要用到了分代收集算法,我会先讲一下常用垃圾收集算法。
常用垃圾收集算法
1. 标记-清除算法
这种垃圾收集算法思路非常简单,主要是首先标记出所有需要回收的对象,然后回收所有需要回收的对象。
但是有一个明显的缺点,采用这种算法之后会发现内存块回收之后就不连续了,这就导致了在下一次想分配一个大内存块的时候无法分配。
2. 标记-清除-压缩
这种垃圾收集算法主要是对上面的算法进行了优化,内存回收了对内存进行了一次优化压缩。这样回收后内存块的连续性又比较强了。
但是这种算法会涉及到不停的内存间的拷贝和复制,性能会非常差。
3.标记-清除-复制
这种算法会将内存空间分配成两块相同的区域A和B。当内存回收的时候,将A中的内存块拷贝到B中,然后一次性清空A。
但是这种算法会对内存要求比较大一些,并且长期复制拷贝性能上也会受影响。
Java分代收集算法
Java主要采用了分代收集算法。分代收集算法主要将对象存活期的长短将内存进行划分。
Java主要将内存划分为两部分:新生代和老生代
Java的新生代中,对象的存活率低,存活期期会相对会比较短一些,所以可以选用复制算法来进行内存回收。
Java的老生代中,对象的存活率比较高,并且相对存活期比较长一些,可以采用标记-清除-压缩的算法来进行内存回收。
可以看图:
通常新生代分为Eden和两个Survivor,其中可以通过-XX:SurvivorRatio=1来设置(这里要考虑两个Survivor,意味着二个S的大小是整个新生代的2/3)
前面已经说了,Java的内存分配和内存回收主要在Java的堆上进行的。而Java的方法区间和常量池我们一般称为永久代。永久代可以通过-XX:PermSize=512M -XX:MaxPermSize=512M设置
Java堆内存设置参数:-Xmx20m -Xms20m
Java堆新生代内存分配设置:-Xmn10m&新生代分配了10M的内存,那么剩下的10M就是老生代上面分配了。也可以设置:-XX:NewRatio=4
通过设置参数,我们就可以在控制台中看到Java虚拟机在执行GC时候的日志:-XX:+PrintGCDetails&&
也可以指定日志的位置:-Xloggc:gc.log&&&
永久代一般是指方法区和常量池,一般情况下永久代在虚拟机运行时就能确定大小的,但是一些框架可能动态生成一些类信息就会导致永久代越来越大。
Java内存分配策略
使用的ParNew+Serial Old收集器组合
1. 优先在Eden上分配。
Java的对象优先会在新生代的Eden上分配。
我们可以看一个例子:
我设置了这些参数:-XX:+PrintGCDetails -Xms20m -Xmx20m -Xmn10m,堆内存分配20M,新生代10M,老生代10M,默认情况下Survivor区为8:1,所以Eden区域为8M
我运行这段代码:
public&class&JavaTest&{&&
&&&&static&int&m&=&1024&*&1024;&&
&&&&public&static&void&main(String[]&args)&{&&
&&&&&&&&//分配2兆&&
&&&&&&&&byte[]&a1&=&new&byte[2&*&m];&&
&&&&&&&&System.out.println(&a1&ok&);&&
&&&&&&&&//分配2兆&&
&&&&&&&&byte[]&a2&=&new&byte[2&*&m];&&
&&&&&&&&System.out.println(&a2&ok&);&&
控制台日志:
&def&new&generation&&&total&9216K,&used&4603K&[0x331dbdbd0000)&&
&&eden&space&8192K,&&56%&used&[0x331d4ef50,&0x339d0000)&&
&&from&space&1024K,&&&0%&used&[0x339ddad0000)&&
&&to&&&space&1024K,&&&0%&used&[0x33adadbd0000)&&
&tenured&generation&&&total&10240K,&used&0K&[0x33bddd0000)&&
&&&the&space&10240K,&&&0%&used&[0x33bdbdbdd0000)&&
&compacting&perm&gen&&total&12288K,&used&381K&[0x345ddd0000)&&
&&&the&space&12288K,&&&3%&used&[0x345d2f4d0,&0xx351d0000)&&
&&&&ro&space&10240K,&&55%&used&[0x385db5b5fd0000)&&
&&&&rw&space&12288K,&&55%&used&[0x38fd744c8,&0xx39bd0000)&&
日志中非常清晰的可以看到,我们分配了一个4M内存大小,直接是分配在了eden space里面。
2. 大对象直接进入老生代。
参数:-XX:PretenureSizeThreshold(该设置只对Serial和ParNew收集器生效) 可以设置进入老生代的大小限制,我们设置为3M,则大于3M的大对象就直接进入老生代
测试代码:
public&class&JavaTest&{&&
&&&&static&int&m&=&1024&*&1024;&&
&&&&public&static&void&main(String[]&args)&{&&
&&&&&&&&//分配2兆&&
&&&&&&&&byte[]&a1&=&new&byte[2&*&m];&&
&&&&&&&&System.out.println(&a1&ok&);&&
&&&&&&&&byte[]&a3&=&new&byte[4&*&m];&&
&&&&&&&&System.out.println(&a2&ok&);&&
控制台日志:
&def&new&generation&&&total&9216K,&used&2555K&[0x331dbdbd0000)&&
&&eden&space&8192K,&&31%&used&[0x331d4ef40,&0x339d0000)&&
&&from&space&1024K,&&&0%&used&[0x339ddad0000)&&
&&to&&&space&1024K,&&&0%&used&[0x33adadbd0000)&&
&tenured&generation&&&total&10240K,&used&4096K&[0x33bddd0000)&&
&&&the&space&10240K,&&40%&used&[0x33bdfdfdd0000)&&
&compacting&perm&gen&&total&12288K,&used&381K&[0x345ddd0000)&&
&&&the&space&12288K,&&&3%&used&[0x345d2f4d0,&0xx351d0000)&&
&&&&ro&space&10240K,&&55%&used&[0x385db5b5fd0000)&&
&&&&rw&space&12288K,&&55%&used&[0x38fd744c8,&0xx39bd0000)&&
上面的日志中,可以清洗看到第一次分配的2M留存在了eden space中,而4M超过了大对象设置的值3M,所以直接进入了老生代tenured generation
3. 长期存活的对象进入老年代
为了演示方便,我们设置-XX:MaxTenuringThreshold=1(默认15),当在新生代中年龄为1的对象进入老年代。
测试代码:
public&class&JavaTest&{&&
&&&&static&int&m&=&1024&*&1024;&&
&&&&public&static&void&main(String[]&args)&{&&
&&&&&&&&//分配2兆&&
&&&&&&&&byte[]&a1&=&new&byte[1&*&m&/&4];&&
&&&&&&&&System.out.println(&a1&ok&);&&
&&&&&&&&byte[]&a2&=&new&byte[7&*&m];&&
&&&&&&&&System.out.println(&a2&ok&);&&
&&&&&&&&byte[]&a3&=&new&byte[3&*&m];&//GC&&
&&&&&&&&System.out.println(&a3&ok&);&&
控制台日志:
[GC&[DefNew:&7767K-&403K(9216K),&0.0062209&secs]&7767K-&K),&0.0062482&secs]&&&
[Times:&user=0.00&sys=0.00,&real=0.01&secs]&&&
&def&new&generation&&&total&9216K,&used&3639K&[0x331dbdbd0000)&&
&&eden&space&8192K,&&39%&used&[0x331dfd0000)&&
&&from&space&1024K,&&39%&used&[0x33adb34de8,&0x33bd0000)&&
&&to&&&space&1024K,&&&0%&used&[0x339ddad0000)&&
&tenured&generation&&&total&10240K,&used&7168K&[0x33bddd0000)&&
&&&the&space&10240K,&&70%&used&[0x33bdddd0000)&&
&compacting&perm&gen&&total&12288K,&used&381K&[0x345ddd0000)&&
&&&the&space&12288K,&&&3%&used&[0x345d2f548,&0xx351d0000)&&
&&&&ro&space&10240K,&&55%&used&[0x385db5b5fd0000)&&
&&&&rw&space&12288K,&&55%&used&[0x38fd744c8,&0xx39bd0000)&&
我们可以看到在A3处有一次GC,并且a2的7M已经满足-XX:MaxTenuringThreshold=1的要求,所以a2进入老年代,而空出来的空间a3就进入新生代
4. 动态对象年龄判定
为了使内存分配更加灵活,虚拟机并不要求对象年龄达到MaxTenuringThreshold才晋升老年代
如果Survivor区中相同年龄所有对象大小的总和大于Survivor区空间的一半,年龄大于或等于该年龄的对象在Minor GC时将复制至老年代
5. 空间分配担保
新生代使用复制算法,当Minor GC时如果存活对象过多,无法完全放入Survivor区,就会向老年代借用内存存放对象,以完成Minor GC。
在触发Minor GC时,虚拟机会先检测之前GC时租借的老年代内存的平均大小是否大于老年代的剩余内存,如果大于,则将Minor GC变为一次Full GC,如果小于,则查看虚拟机是否允许担保失败,如果允许担保失败,则只执行一次Minor GC,否则也要将Minor GC变为一次Full GC。
说白了,新生代放不下就会借用老年代的空间来进行GC
Java垃圾收集器:
首先我们可以看一张图,下面这张图中列出来新生代和老生代可以用到的垃圾收集器。
1. Serial 收集器 串行
单线程的串行收集器。它在垃圾收集的时候会暂停其它所有工作线程。直到收集结束。一般在客户端模式下使用。
2. ParNew收集器 并行
ParNew收集器是Serial的多线程版本。一般运行在Server模式下首先的新生代收集器。如果老年代使用CMS收集器,基本也只能和它进行合作。参数:-XX:+UseConcMarkSweepGC,比较适合web服务的收集器。
一般ParNew和CMS组合
3. Parallel Scavenge收集器 并行
它使用复制算法的收集器,并且是多线程的。该收集器主要目的就是达到一个可控制的吞吐量,说白了就是CPU的利用率。于是该收集器比较适合后端运算比较多的服务。
-XX:MaxGCPauseMillis每次年轻代垃圾回收的最长时间(最大暂停时间),收集器尽量保证内存回收时间不大于这个值,应该设置一个合理的值。
-XX:GCTimeRatio设置垃圾回收时间占程序运行时间的百分比
-XX:+UseAdaptiveSizePolicy&设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开.
4.Serial Old收集器 串行
单线程串行的老生代收集器。
5. Parallel Old 收集器 并行
使用“标记-整理”的算法。该收集器比较适合和Parallel Scavenge收集器进行组合。-XX:+UseParallelOldGC
6. CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,目前大部分的B/S系统都使用CMS的收集器。一般CMS是老生代收集器,新生代就和PerNew进行组合。
CMS收集器基于“标记-清除”的算法。分四个阶段:初始标记,并发标记,重新标记,并发清除
CMS收集器的优点:并发收集、低停顿
1. CMS收集器对CPU资源非常敏感。在并发阶段,虽然不会导致用户线程停顿,但是会占用CPU资源而导致引用程序变慢,总吞吐量下降。CMS默认启动的回收线程数是:(CPU数量+3) / 4。
2. CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure“,失败后而导致另一次Full &GC的产生。由于CMS并发清理阶段用户线程还在运行,伴随程序的运行自热会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在本次收集中处理它们,只好留待下一次GC时将其清理掉。这一部分垃圾称为“浮动垃圾”。也是由于在垃圾收集阶段用户线程还需要运行,即需要预留足够的内存空间给用户线程使用,因此CMS收集器不能像其他收集器那样等到老年代几乎完全被填满了再进行收集,需要预留一部分内存空间提供并发收集时的程序运作使用。在默认设置下,CMS收集器在老年代使用了68%的空间时就会被激活,也可以通过参数-XX:CMSInitiatingOccupancyFraction的值来提供触发百分比,以降低内存回收次数提高性能。要是CMS运行期间预留的内存无法满足程序其他线程需要,就会出现“Concurrent Mode Failure”失败,这时候虚拟机将启动后备预案:临时启用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间就很长了。所以说参数-XX:CMSInitiatingOccupancyFraction设置的过高将会很容易导致“Concurrent Mode Failure”失败,性能反而降低。
3. CMS是基于“标记-清除”算法实现的收集器,使用“标记-清除”算法收集后,会产生大量碎片。空间碎片太多时,将会给对象分配带来很多麻烦,比如说大对象,内存空间找不到连续的空间来分配不得不提前触发一次Full &GC。为了解决这个问题,CMS收集器提供了一个-XX:UseCMSCompactAtFullCollection开关参数,用于在Full &GC之后增加一个碎片整理过程,还可通过-XX:CMSFullGCBeforeCompaction参数设置执行多少次不压缩的Full &GC之后,跟着来一次碎片整理过程。
w=windmatlab
按提示选择即可,出来类似语句:
&[w_wsq_data,w_wsq_codes,w_wsq_fields,w_wsq_times,w_wsq_errorid,w_wsq_reqid]=w.wsq('000002.SZ,000004.SZ,000001.SZ,510050.SH,510300.OF','rt_date,rt_time,rt_pre_close,rt_open,rt_high,rt_low,rt_last,rt_last_amt,rt_last_vol,rt_latest,rt_vol,rt_amt,rt_chg,rt_pct_chg,rt_high_limit,rt_low_limit,rt_swing,rt_vwap,rt_upward_vol,rt_downward_vol,rt_bsize_total,rt_asize_total,rt_vol_ratio,rt_turn,rt_pre_iopv,rt_iopv,rt_mkt_cap,rt_float_mkt_cap,rt_pre_oi,rt_oi,rt_oi_chg,rt_pre_settle,rt_settle,rt_discount,rt_discount_ratio,rt_pe_ttm,rt_pb_lf,rt_rise_days,rt_spread,rt_susp_flag,rt_high_52wk,rt_low_52wk,rt_pct_chg_1min,rt_pct_chg_3min,rt_pct_chg_5d,rt_pct_chg_10d,rt_pct_chg_20d,rt_pct_chg_60d,rt_last_cp,rt_last_ytm,rt_pre_close_dp,rt_ask1,rt_ask2,rt_ask3,rt_ask4,rt_ask5,rt_ask6,rt_ask7,rt_ask8,rt_ask9,rt_ask10,rt_bid1,rt_bid2,rt_bid3,rt_bid4,rt_bid5,rt_bid6,rt_bid7,rt_bid8,rt_bid9,rt_bid10,rt_bsize1,rt_bsize2,rt_bsize3,rt_bsize4,rt_bsize5,rt_bsize6,rt_bsize7,rt_bsize8,rt_bsize9,rt_bsize10,rt_asize1,rt_asize2,rt_asize3,rt_asize4,rt_asize5,rt_asize6,rt_asize7,rt_asize8,rt_asize9,rt_asize10,rt_ma_5d,rt_ma_10d,rt_ma_20d,rt_ma_60d,rt_ma_120d,rt_ma_250d,rt_delta,rt_gamma,rt_vega,rt_theta,rt_rho,rt_imp_volatility',@wsqcallback)

我要回帖

更多关于 夏普比率公式 的文章

 

随机推荐