Stata如何把变量映射到散点的颜色上?

Stata如何把变量映射到散点的颜色上?

上次在使用Stata构造马科维茨有效前沿的最后没能找到把夏普比率映射到散点颜色散上的办法,刚刚整理笔记的时候发现了colorscatter这个命令。发现这个命令可以帮助实现这个想法。

首先把上次的Stata构造马科维茨有效前沿的主要代码复制过来:

Stata
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
* 准备数据集
cpd /
cap mkdir "Stata马科维茨有效前沿的实现"
cd "Stata马科维茨有效前沿的实现"
* 使用上证50四根票进行组合,首先获取四只股票的交易数据
foreach i in "600000" "600016" "600019" "600028"{
cntrade2 `i', start(20180101) end(20180927)
save `i', replace
}

use 600000, clear
keep close date
ren close 浦发银行
save a600000, replace

use 600016, clear
keep close date
ren close 民生银行
save a600016, replace

use 600019, clear
keep close date
ren close 宝钢股份
save a600019, replace

use 600028, clear
keep close date
ren close 中国石化
save a600028, replace

use a600000, clear
foreach i in "600016" "600019" "600028"{
merge 1:1 date using a`i'
drop _m
}
save rawdata, replace

* 计算对数收益率
use rawdata, clear
* 由于股票交易日之间可能存在间隔,所以不能直接用日期作为时间变量
gen dateid = _n
tsset dateid
foreach i of varlist _all{
if "`i'" != "date" & "`i'" != "dateid"{
gen l`i' = l.`i'
replace `i' = log(`i'/l`i')
drop l`i'
format `i' %6.4f
}
}
drop dateid
save returndata, replace

* 蒙特卡洛模拟
cap prog drop front
prog def front, rclass
version 15.1
use returndata, clear
local w1 = runiform()
local w2 = runiform()
local w3 = runiform()
local w4 = runiform()
mat weight = (`w1' \ `w2' \ `w3' \ `w4')
mat list weight
mat weight = weight / (`w1'+`w2'+`w3'+`w4')
mat list weight
ret scalar w1 = weight[1, 1]
ret scalar w2 = weight[2, 1]
ret scalar w3 = weight[3, 1]
ret scalar w4 = weight[4, 1]
local j = 1
foreach i of varlist _all{
if "`i'" != "date"{
qui sum `i'
local r`j' = r(mean)
local j = `j' + 1
}
}
mat returns = (`r1', `r2', `r3', `r4')
mat list returns
mat a = returns * weight * 252
mat list a
ret scalar ret = a[1, 1]
corr 浦发银行 民生银行 宝钢股份 中国石化, cov
ret list
mat variance = r(C)
mat list variance
mat b = weight' * variance * 252 * weight
mat list b
ret scalar var = b[1, 1]
ret scalar std = sqrt(b[1, 1])
end

simulate ret = r(ret) var = r(var) std = r(std) w1 = r(w1) w2 = r(w2) w3 = r(w3) w4 = r(w4), reps(10000): front
* 计算夏普比率
gen sharpe_ratio = (ret - 0.04)/std
save montecarlo, replace

use montecarlo, clear
tw sc ret std, msize(*0.8) xti(波动率) yti(收益率) ///
xla(#6, format(%6.2f)) yla(, format(%6.1f)) ///
ti("图:投资组合收益率与波动率的关系")
gre 投资组合收益率与波动率的关系

绘制出来的图是这样的:

下面我们使用colorscatter命令把颜色映射到散点的颜色上,不过由于这个命令关于图例使用设计的不是很合理,所以需要先改造一下。运行下面的命令打开ado文件:

Stata
1
adoedit colorscatter

显然这个命令实现的原理是将散点分成一些组然后以此绘制出来,所以我们需要知道分了多少组?所以我先把这个分组的组数存储到返回值中。
首先修改第2行为:

Stata
1
program define colorscatter, rclass

然后在45行加上:

Stata
1
ret local levels = "`i'"

因为这个i就是分组的组数。

保存,clear all,运行下面的绘图命令:

Stata
1
2
3
4
5
6
7
colorscatter ret std sharpe_ratio, scatter_options(msymb(Oh)) ///
ti("图:投资组合收益率与波动率的关系") ///
xti(波动率) yti(收益率) ///
xla(#6, format(%6.2f)) yla(, format(%6.1f)) ///
rgb_low(255 0 0) rgb_high(0 255 0) leg(pos(6) order(1 "最低夏普比率:-1.7" `r(levels)' "最高夏普比率:0.1") row(1))

ret list

# Stata

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×