用R平滑价格曲线的方法之一:LOWESS
2011-08-27 20:54阅读:
利用均线交叉信号进行趋势交易,除了在盘整行情中难以获利之外,在快速剧烈波动的行情中,由于均线有一定的滞后性,难以抓住剧烈波动的短期行情特征,依赖于原始价格信息生成的均线交易,可能造成亏损的结果。通常,交易员会利用数据平滑技术对原始价格进行处理,过滤掉频繁的短期波动信息,获取“中长期”趋势带来的交易机会,获取更好的回报。
局部加权回归散点平滑法(locally weighted scatter plot
smoothing,LOWESS或LOESS)是查看二维变量之间关系(i.e 平滑y-x曲线)的一种有力工具。
LOWESS 方法类似于移动平均技术,是在指定的窗口之内,每一点的数值都用窗口内临近的数据进行加权回归得到的,回归方程可用线性的或者二次的。如果在指定的窗口宽度之内,拟进行平滑的数据点两侧的进行平滑的数据点是相等的,则为对称LOWESS,如果两侧数据点不等,则为非对称
LOWESS。一般来说,LOWESS
方法包括以下步骤:
- 计算指定窗口内各个数据点的初始权重,权重函数一般表达为数值之间欧氏距离比值的立方函数;
- 利用初始权重进行回归估计,利用估计式的残差定义稳健的权函数,计算新的权重;
- 利用新的权重重复步骤2,不停的修正权函数,第N 步收敛后可根据多项式和权重得到任意点的光滑值。
利用 LOWESS
方法进行数据平滑处理的重点参数在于窗口宽度的选择,窗口宽度过大将使得光滑描点涵盖的历史数据过多,降低最新价格信息对平滑值的影响,反之,过窄的窗口宽度使“平滑”后的数据并不平滑。需要指出的是,由于LOWESS方法应用的是某一数据点两侧的数值进行平滑,而对于股票价格等金融时间序列而言,得到最新的实际成交价格之后,如果对该时刻的平滑值进行估计,则往往缺失该时点右侧的数据信息,因此LOWESS
在股票价格平滑处理中的应用,是以“非对称”的方式进行的。
R程序代码:
# 取5分钟行情数据。记得用你自己的数据存取方式!
library(RpgSQL)
r_conn <- dbConnect(pgSQL(), user='postgres',
password='postgres', dbname='trade_test',
host='localhost')
sampling_date_start <- '2011-01-01'
sampling_date_end <- '2011-02-01'
X_ticker <- 'sh600036 招商银行'
X_market <- toupper(substr(X_ticker, 1, 2))
X_symbol <- substr(X_ticker, 3, 8)
# 图形标题
p_title <- paste(X_ticker, '收盘价:', sampling_date_start,
'/', sampling_date_end, sep='')
q <- paste('select qdatetime as dt, close as price from
quote where upper(market) like '', X_market,
'' and symbol like '',
X_symbol,
'' and qdatetime between '',
sampling_date_start,
'' and '', sampling_date_end,
''', sep='')
X <- dbGetQuery(r_conn, q)
par(las=1, mgp=c(2.5, 1, 0))
plot(X, pch=20, col=rgb(0, 0, 0, 0.5),
main=p_title)
# 取不同的f参数值
for (i in seq(0.01, 1, length = 100)) {
lines(lowess(X$dt, X$price, f = i),
col = gray(i), lwd = 1.5)
Sys.sleep(0.15)
}
以上
Sys.sleep()语句只是为了看清楚添加LOWESS曲线的过程,实际画图过程中可以去掉。代码
生成图形如下:
上图中,曲线颜色越浅表示所取数据比例越大。不难看出白色的曲线几乎已呈直线状,而黑色的线则波动较大。
为了确保用LOWESS方法得到的趋势是稳定的,我们可以进一步用Bootstrap的方法验证。因为Bootstrap方法是对原样本进行重抽样,
根据抽得的不同样本可以得到不同的LOWESS曲线,最后我们把所有的曲线添加到图中,看所取样本不同是否会使得LOWESS有显著变化。以下是R代码:
set.seed(711) # 设定随机数种子,保证本图形可以重制
par(las=1, mgp=c(2.5, 1, 0))
plot(X, pch = 20, col=rgb(0, 0, 0, 0.5),
main=p_title)
for (i in 1:400) {
idx = sample(nrow(X), 300, TRUE) #
抽取300个样本序号
lines(lowess(X$dt[idx],
X$price[idx]), col = rgb(0,
0, 0,
0.05), lwd = 1.5) # 用半透明颜色,避免线条重叠使得图形看不清
Sys.sleep(0.05)
}
dev.off()
生成图形如下:
可以看出,经过400次重抽样并计算LOWESS曲线,刚才在第一幅图中观察到的趋势大致都还存在(因为默认取数据比例为2/3,因此拟合曲线都比较光滑)。
如何在波动频繁的行情中筛选可靠信号是算法交易中需要解决的基本问题之一。事实上,将语音识别领域常用的小波分析技术应用在信号筛选上正是目前算法交易和量化投资领域比较热门的话题。
待续:基于小波分析、Lowess
方法和原始价格序列的模拟趋势交易结果比较