A:
低频数据计算波动率
可使用已有公用模型:
N日标准差(用对数收益率计算的N日标准差,即波动率):FAQ:
StockStdev2
支持任意周期,效率较高,推荐使用。
若除了获取波动率外,还需要获取如Beta,Alpha,平均收益率,收益率标准差,残差标准差等,则可考虑使用下面这两个模型(多指标批量提取示例可参考示例06):
风险指标可使用:FAQ:
StockBetaAlpha2
波动率函数(调用StockBetaAlpha2):FAQ:
StockRisk
支持日线,周线,月线等低频。
示例01:通过指定区间的日线数据计算波动率
//计算万科A在指定区间内的波动率,收益率序列为日线
begt:=20220101T;
endt:=20220630T;
SetSysParam(pn_stock(),'SZ000002');
SetSysParam(pn_cycle(),cy_day()); //日线
setsysparam(pn_date(),endt);
return StockStdev2(tradedays(begt,endt));
返回:2.83756576955116
示例02:计算指定区间的每日波动率(由最近N日收益率计算)
begt:=20220101T;
endt:=20220630T;
N:=20;//取最近20个交易日的数据计算
SetSysParam(pn_stock(),'SZ000002');
SetSysParam(pn_cycle(),cy_day()); //日线
setsysparam(pn_date(),endt);
Nd:=tradedays(begt,endt);
return Nday(Nd,"time",datetostr(sp_time()),
"波动率",StockStdev2(N));
返回:(部分结果截图)
日内高频数据计算波动率
可使用时间序列模型Nday与sp_std进行计算得到。
示例03:计算指定区间内1分钟线的波动率序列
begt:=20250714.09T;//开始时间
endt:=20250714.16T;//截止时间
N:=20;//取最近20个交易日的数据计算
SetSysParam(pn_stock(),"SH600519");
SetSysParam(pn_cycle(),cy_1m()); //分钟线
setsysparam(pn_date(),endt);
Nd:=tradedays(begt,endt);
return Nday(Nd,"time",datetimetostr(sp_time()),
"波动率",StockStdev2(N));
批量提取-月度波动率(当月日线价格序列计算波动率)
示例04:提取一段时间内指定板块每月的波动率
begt:=20240101T; //开始时间
endt:=20241231T; //截止时间
//月线序列
setsysparam(pn_cycle(),cy_month());
setsysparam(pn_stock(),"SH000001");
Tarr:=Markettradedayqk(begt,endt);
if not istable(Tarr) then return array();
vBegt:=specdate(ref(sp_time(),1),Tarr[0])+1;//第一个月线的开始日
SetSysParam(pn_cycle(),cy_day()); //日线-用日线价格序列计算波动率
ret:=array();
for i,vEndt in Tarr do
begin
intD:=datetoint(vEndt);
setsysparam(pn_date(),vEndt);
stocks:=getAbkbydate("上证A股",vEndt);//指定日上证A股
for j,stockid in stocks do
begin
setsysparam(pn_stock(),stockid);
ret[stockid][intD]:=StockStdev2(tradedays(vbegt,vEndt));
end;
vBegt:=vEndt+1;
end;
return ret;
返回:(部分结果截图)
示例06:批量提取多风险指标-每月度的日线计算值
begt:=20240101T; //开始时间
endt:=20241231T; //截止时间
//月线序列
setsysparam(pn_cycle(),cy_month());
setsysparam(pn_stock(),"SH000001");
Tarr:=Markettradedayqk(begt,endt);
if not istable(Tarr) then return array();
vBegt:=specdate(ref(sp_time(),1),Tarr[0])+1;//第一个月线的开始日
SetSysParam(pn_cycle(),cy_day()); //日线-用日线价格序列计算风险指标
ret:=array();k:=0;
for i,vEndt in Tarr do
begin
intD:=datetoint(vEndt);
setsysparam(pn_date(),vEndt);
stocks:=getAbkbydate("上证A股",vEndt)[0:9];//指定日上证A股前10个股票-方便展示
for j,stockid in stocks do
begin
setsysparam(pn_stock(),stockid);
r:=StockBetaAlpha2('SH000001',vbegt,vEndt);
ret[k]:=r;
ret[k,"Stockid"]:=stockid;
ret[k,"Date"]:=intD;
k++;
end;
vBegt:=vEndt+1;
end;
ret:=select ["Stockid"],["Date"],* from ret end;//将 "Stockid","Date" 前移
return ret;
返回:(部分结果截图)
