about云开发

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

about云开发 首页 大数据 Spark 连载 查看内容

Spark 高级分析:第九章第6,7节 权重因子的确定和数据抽样

2018-11-25 17:48| 发布者: admin| 查看: 35| 评论: 0|原作者: feilong

摘要: 问题导读 1.如何确定权重因子? 2.如何拟合线性模型? 3.如何进行数据抽样? 关注最新经典文章,欢迎关注公众号 Spark 高级分析:第九章第5节 数据预处理 http://www.aboutyun.com/forum.php?mod=v ...
问题导读

1.
如何确定权重因子
2.如何拟合线性模型?

3.如何进行数据抽样



关注最新经典文章,欢迎关注公众号



Spark 高级分析:第九章第5节 数据预处理
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26315


回想一下,风险价值在特定的时间范围内处理损失。我们不关心票据的绝对价格,而是那些价格如何在一定的时间内波动。在我们的计算中,我们将把这个跨度设定为两个星期。下面的函数使用Scala集合的sliding方法将价格时间序列转换为两个星期间隔内价格波动的重叠序列。请注意,我们使用10而不是14来定义窗口,因为财务数据不包括周末。
[Scala] 纯文本查看 复制代码
def twoWeekReturns(history: Array[(DateTime, Double)])
: Array[Double] = {
history.sliding(10).
map(window => window.last._2 - window.head._2).
toArray
}
val stocksReturns = stocks.map(twoWeekReturns)
val factorsReturns = factors.map(twoWeekReturns)

有了这些返回历史,我们可以转向我们的训练目标票据回报的预测模型。对于每种工具,我们想要一个这样的模型,该模型基于同一时间段内因素的回报来预测其两周的回报。为了简单起见,我们将使用线性回归模型。

为了对票据回报可能是回报因子的非线性函数这一事实进行建模,我们可以在我们的模型中包括从回报因子的非线性变换导出的一些附加特征。我们将尝试为每个因子返回添加两个额外的特征:平方和平方根。我们的模型仍然是一个线性模型,在这个意义上,响应变量是特征的线性函数。一些特征恰好是由因子返回的非线性函数来确定的。请记住,这个特定的特征转换旨在展示一些可用的选项——它不应该被接受为预测金融建模的最新实践。

虽然我们将执行许多回归-每个票据一个-在每个回归中的特征和数据点的数量很小,这意味着我们不需要利用Spark的分布式线性建模能力。相反,我们将使用由Apache CAMONS数学包提供的普通最小二乘回归。尽管我们的因子数据当前是历史序列(每个都是(DateTime,Double)元组数组),OLSMultipleLinearRegression期望数据作为样本点数组(在我们的例子中为两周间隔),所以我们需要转置因子矩阵:
[Scala] 纯文本查看 复制代码
def factorMatrix(histories: Seq[Array[Double]])
: Array[Array[Double]] = {
val mat = new Array[Array[Double]](histories.head.length)
for (i <- 0 until histories.head.length) {
mat(i) = histories.map(_(i)).toArray
}
mat
}
val factorMat = factorMatrix(factorsReturns)

然后我们可以修改我们的附加特征:
[Scala] 纯文本查看 复制代码
def featurize(factorReturns: Array[Double]): Array[Double] = {
val squaredReturns = factorReturns.
map(x => math.signum(x) * x * x)
val squareRootedReturns = factorReturns.
map(x => math.signum(x) * math.sqrt(math.abs(x)))
squaredReturns ++ squareRootedReturns ++ factorReturns
}
val factorFeatures = factorMat.map(featurize)

然后拟合线性模型:
[Scala] 纯文本查看 复制代码
import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression
def linearModel(instrument: Array[Double],
factorMatrix: Array[Array[Double]])
: OLSMultipleLinearRegression = {
val regression = new OLSMultipleLinearRegression()
regression.newSampleData(instrument, factorMatrix)
regression
}
val models = stocksReturns.map(linearModel(_, factorFeatures))

为了简洁起见,我们将省略此分析,但是在任何现实世界的流水线中,理解这些模型与数据的匹配程度将是有用的。由于数据点是从时间序列得出的,特别是因为间隔重叠的时间,这很可能是样本自相关。这意味着像R 2这样的公共措施可能会高估模型适合数据的程度。Breusch Godfrey试验是评估这些效应的标准试验。一种快速评估方法模型是将时间序列分为两组,留下了足够的数据点在中间,在前面的设置最后点不相关在稍后设置第一点。然后在一个集合上训练模型并在另一个集合上观察它的错误。
为了找到每个票据的模型参数,我们可以使用OLSMultipleLinearRegression的estimateRegressionParameters方法。
[Scala] 纯文本查看 复制代码
val factorWeights = models.map(_.estimateRegressionParameters())
.toArray

现在我们有一个1867×8矩阵,其中每一行都是票据的模型参数(系数、权重、协变量、回归器,无论你想称之为什么)的集合。


由于我们的模型将因素回报映射到工具回报率手中,我们现在需要一个通过生成随机因素回报来模拟市场条件的过程。也就是说,我们需要决定因子回报向量和样本的概率分布。数据实际上采取了什么分布?从视觉上开始回答这类问题通常是有用的。可视化连续数据上的概率分布的一种好方法是绘制分布域与其PDF的密度图。由于我们不知道支配数据的分布,我们没有方程可以给出它在任意点的密度,但是我们通过称为核密度估计的技术来近似它。以松散的方式,核密度估计是平滑直方图的一种方法。它在每个数据点集中概率分布(通常是正态分布)。因此,一组两周的返回样本将导致200个正态分布,每个均具有不同的平均值。为了估计给定点处的概率密度,它评估该点处所有正态分布的PDF并取其平均值。核密度图的平滑性取决于它的带宽,每个正态分布的标准偏差。Github存储库具有一个内核密度实现,它既适用于RDDs又适用于本地集合。为了简洁起见,它在这里被省略了。

breeze-viz是一个Scala文库,可以很容易地画出简单的情节。下面的片段从一组样本中创建一个密度图。
[Scala] 纯文本查看 复制代码
import com.cloudera.datascience.risk.KernelDensity
import breeze.plot._
def plotDistribution(samples: Array[Double]) {
val min = samples.min
val max = samples.max
val domain = Range.Double(min, max, (max - min) / 100).
toList.toArray
val densities = KernelDensity.estimate(samples, domain)
val f = Figure()
val p = f.subplot(0)
p += plot(domain, densities)
p.xlabel = "Two Week Return ($)"
p.ylabel = "Density"
}
plotDistribution(factorReturns(0))
plotDistribution(factorReturns(1))

以下是我们历史上债券的两周收益率的分布(概率密度函数):

图片1.png

这两个星期的原油回报率是一样的:
图片2.png
我们将拟合一个正态分布到每个因素的回报。寻找更异国情调的分布,也许更胖的尾巴,更贴近数据往往是值得的。然而,为了简单起见,我们将避免以这种方式调整我们的模拟。

采样因子返回的最简单方法是对每个因子拟合正态分布,并独立从这些分布中采样。然而,这忽略了一个事实,即市场因素往往是相关的。如果标普指数下跌,道琼斯指数也可能下跌。没有考虑到这些相关性,可以让我们更清楚地了解我们的风险状况。我们的因素的回报是相关的吗?从公有数学的皮尔森相关实现可以帮助我们找到答案。
[Scala] 纯文本查看 复制代码
import org.apache.commons.math3.stat.correlation.PearsonsCorrelation
val factorCor = new PearsonsCorrelation(factorMat).getCorrelationMatrix().getData()
println(factorCor.map(_.mkString("\t")).mkString("\n"))
1.0 -0.3483711940254621 0.23398963510103332 0.39751849093072483
-0.3483711940254621 1.0 -0.21986388382897273 -0.4429969717412909
0.23398963510103332 -0.21986388382897273 1.0 0.3349660841463583
0.39751849093072483 -0.4429969717412909 0.3349660841463583 1.0

当我们在非对角线上有非零元素时,它看起来就不一样了。



鲜花

握手

雷人

路过

鸡蛋
关闭

推荐上一条 /3 下一条

QQ|小黑屋|about云开发-学问论坛|社区 ( 京ICP备12023829号

GMT+8, 2018-12-19 18:58 , Processed in 0.348598 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2 Licensed

返回顶部