夏普率(The Sharpe ratio)=(预期收益率 - 无风险利率)/投资组合标准差

也叫报酬与波动性比率,可能是最常用的投资组合管理度量标准。它采用的方法是,组合中超过无风险利率的那部分收益要用投资组合的标准差来衡量。

如果夏普率=2,表示风险每增长1%,可以换来2%的收益;这个难度其实很大,去看那些有10年以上业绩基金,sharp没有超过1的

  • 夏普率通常是天为基本单位,如果是短线策略也要先按天计算出净值,就是daily return,然后才能算sharp
  • 无风险收益率用十年期国债收益率,大概是 2.85%,一年有252个交易日
  • 研究出一个量化策略,跑出pnl曲线,然后算一下sharp率,就可以评估策略的可行性

python代码

1
2
3
4
5
6
7
import pandas as pd
import numpy as np
def sharpe(daily_return):
    if len(daily_return) <2:return 0
    df = pd.DataFrame(daily_return,columns=['value'])
    ds = np.log(df["value"]) - np.log(df['value'].shift(1))
    return (ds.mean()- 0.0285/252)/ds.std()*np.sqrt(252)

c++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
 base 是初始金额,dailys里面是每日profit
*/
float sharpe(std::vector<float> &dailys, float base)
{
	if (dailys.size() == 0 || base <= 0)
		return 0;

	std::vector<float> rtn;
	float sum = 0;
	for (int i = 1; i < dailys.size(); i++)
	{
		float t = log((dailys[i] + base) / (dailys[i - 1] + base));
		sum += t;
		rtn.push_back(t);
	}

	if (rtn.size() < 2)
		return 0;
	float mean = sum / rtn.size();

	float accum = 0.0;
	std::for_each(std::begin(rtn), std::end(rtn), [&](const float d) {
		accum += (d - mean) * (d - mean);
	});
	float stdev = sqrt(accum / (rtn.size() - 1));
	//先转化成天,无风险收益用10年期国债利率 2.85%
	return sqrt(252) * (mean - 0.0285 / 252) / stdev;
}