【数据挖掘与R语言--预测股票市场收益】目标描述,定义预测任务

2019-04-10 10:04:06 浏览数 (1)

最近在看这本书,感觉很不错,理论,算法,实践兼顾,我只放出我感兴趣的部分章节的笔记,本章分会分步更新,关于数据导入和数据预处理就不写了,直接开始目标描述和定义预测任务。本书中英文版的都有,我共享到文章结尾处,有需要的同学可以去下载。

问题描述与目标

对数据挖掘而言股票市场交易是个具有巨大潜力的应用领域。事实上,由于大量历史数据的存在,人工对这些数据进行检测是很困难的,而数据挖掘技术对大数据有先天的优势。另一方面,有学者声称,市场在价格调整上适应之快,以至于根本没有空间可以得到稳定的收益。这就是有名的有效市场假设。这个理论先后被一些更宽松的版本所取代,即由于短暂的市场无效,市场还是有一些交易机会空间的。

股票交易的总体目标是维持一个基于买卖订单的股票组合。长期目标就是从这些股票交易中获取尽可能多的利润。本章对股票组合简化,只“交易”一只单一的证券,这里采用股票市场指数—标准普尔指数。对于给定的证券和初始资金,我们将尝试通过交易行为(买人、卖出、持有),在未来一段测试期使利润最大化。应用数据挖掘技术得到结果给出信号,然后据此作为决策的基础来制定交易策略。在该过程中,我们应用标准普尔500指数的历史数据来预测未来的指数变化。因此我们的预测模型将包含进一个交易系统中,该交易系统应用模型的预测结果来生成决策。总体的评估标准就是该交易系统的性能,即该交易系统的交易所产生的利润或者损失,以及对投资者有意义的一些其他统计指标。因此,我们的主要评价指标是应用数据挖掘过程发现的知识来进行交易所产生的结果,而不是在该过程中所开发的模型的预测准确性。

定义预测任务

假设从交易方面看,我们认为价格变动超过P%时值得交易(即获利超过交易费用)。在这个假设下,我们需要预测模型来预测在未来k天中是否能够获得这个边际利润。注意,在这k天中,实际上可以观察的价格可能高于这个比例和低于这个比例。这意味着,预测未来某个特定时间t k的报价可能不是最好的方法。事实上,我们需要预测的是在未来k天中价格总的动态变化,并不是预测某个特定时间的一个特定价格。例如,在时间,t k的收盘价的变化可能比p%低得多,但是在它前面日期t,…,t k的价格变化可能远远大于p%。因此,我们事实上需要的是未来k天的总体价格趋势。

我们从报价数据计算一个变量,它可以作为未来k天的趋势指标值。这一指标值应与我们对接下来的k天能够获得p%的价格变化的信心相关。在这个阶段,重要的是要注意,当我们提到p%的变化时,它的意思是高于或低于目前的价格。这里的想法是,正的变化将导致买入,而负的变化将触发卖出行动。这里我们给的指标把趋势作为一个单一的值,正值表示向上的趋势,负值表示价格向下的趋势。

假设每天的平均价格可以由一下面公式来近似:

其中,Ci,Hi,Li和分别为第i天的收盘价、最高价和最低价。

设Vi代表未来k天的平均价格相对今天收盘价的百分比变化(通常称为算术收益)

我们把动态变化绝对值超过目标收益p%的变化进行累加作为一个指标变量T:

指标变最T用来找出在k天内,日平均价格明显高于目标变化的那些日期的变化之和。大的正T值意味着有几天的日平均报价高于今天收盘价的p%,这种情况表明有潜在的机会发出买入指令,因为有良好的预期价格会上涨。另一方面,大的负T值表明价格可能下降。可以进行卖出。下面的函数实现这个简单的指标:

> T.ind <-function(quotes,tgt.margin=0.025,n.days=10) { v <- apply(HLC(quotes),1,mean) r <-matrix(NA,ncol=n.days,nrow=NROW(quotes)) for(x in 1:n.days) r[,x] <-Next(Delt(Cl(quotes),v,k=x),x) x <- apply(r,1,function(x) sum(x[x >tgt.margin | x < -tgt.margin])) if (is.xts(quotes)) xts(x,time(quotes)) elsex }

函数首先计算平均价格。函数HLC()从价格对象中提取价格的最高价、最低价和收盘价。然后,计算未来n.days天相对当前收盘价的收益。函数next()按时间平移一个时间序列(向前或向后)。Delt ( )函数可用于计算价格序列的百分比收益或对数收益。最后,T.ind()函数将绝对值大的收益相加,也就是说,收益超过目标变化收益,默认设置为2..5%。

为更好地理解指标T的性质。绘图的代码如下:

代码语言:javascript复制
> library(quantmod)
代码语言:javascript复制
> getSymbols('^GSPC',from='2015-01-01',to='2015-12-17')
代码语言:javascript复制
> candleChart(last(GSPC,'3 months'),theme='white',TA=NULL)
代码语言:javascript复制
> avgPrice <- function(p) apply(HLC(p),1,mean)
代码语言:javascript复制
> addAvgPrice <- newTA(FUN=avgPrice,col=1,legend='AvgPrice')
代码语言:javascript复制
> addT.ind <- newTA(FUN=T.ind,col='red',legend='tgtRet')
代码语言:javascript复制
> addAvgPrice(on=1)
代码语言:javascript复制
> addT.ind()

函数candleChart()绘制股票价格的K线图。K线图用一个彩色的框和竖直的柱条来代表每日报价情况。柱条代表当天的最高、最低价格,而框代表开盘价和收盘价。框的颜色用来表示框的顶部所代表的价格(开盘价还是收盘价),即在一天中价格是下降(橘色)还是上升(绿色)。这和国内标注涨跌的颜色正好是相反的。我们在同一张K线图中,增加了另外两个指标:平均价格(和K线在同一张图上)和T指标。函数newTA()可用于绘制新的函数指标并加人到已有的K线图中。该函数的返回值是一个绘图函数.这意味着可以像调用R的其他函数一样来调用对象addT. ind和对象acidAvgPrice。这由最后两条指令来完成,每一条指令把一个指标绘制到前面用candleChart()得到的K线图中。每条指令都增加一个指标让candleChart()函数产生初始图形。调用函数addAvgPrice ( )的参数为1,这意味着该指标将被绘制到第一个图形窗口中,即前面得到的K线图中。调用函数addT.ind()时采用默认参数(而不是设为1),这导致在K线图下绘制新的图形。由于指标T的量纲和K线图不同,所以在另一个图形中绘制T是合理的。

如图所示,当有一系列的时期价格上升时,T值达到了最大。显然,为了计算在时间i时指标T的取值,需要有未来10天的价格,因此这里不是用T来预侧未来价格。预测未来价格不是指标T的目的,其目的是把未来观测到的价格变化概括为一个单一的值。

本案例的方法假设在时刻t的正确交易行为是和我们对未来k天价格的变化预期相关的。我们用指标T来描述未来价格的变化。如果T值高于一个给定的界限值,那么正确的交易信号应该是“买人”;如果T值低于一个给定的界限值,那么正确的交易信号将是“卖出”。在其他情况下,正确的交易方式将是什么也不做(即持有)。总之,我们想要预测时刻!的正确交易信号。

对于历史价格数据,我们将计算每天的T值,并用给定的界限值,用上面给出的方法得到每一天的正确信号。

明天我们来讲预测变量。

本书英文版:链接:http://pan.baidu.com/s/1qXbk6HA 密码:fan6

本书中文版:链接:http://pan.baidu.com/s/1mhzFmTM 密码:6thz

欢迎转发,评论,赞赏。

0 人点赞