Hatena::ブログ(Diary)

My Life as a Mock Quant このページをアンテナに追加 RSSフィード Twitter

2016-02-03

WindowsでHADOOPを使いたい

13:56 | WindowsでHADOOPを使いたいを含むブックマーク

なぜWindows?とい無粋な話はどうでもいい。

最新版をビルドしているありがたい方がいらっしゃるので、これを拝借する。

のリンクにあるtar.gzファイルをダウンロードして、そこをHADOOP_HOMEと環境変数に設定しておけばOKだった。

winutil.exeというものを梱包しておいてくれるのがありがたポイント。

参考

2016-01-31

Scalaのforは直積集合を作るのに便利

| 22:27 | Scalaのforは直積集合を作るのに便利を含むブックマーク

scala> for(x <- 1 to 3; y <- 1 until 5){println(x + " " + y)}
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
3 2
3 3
3 4

これはイケてる。

2016-01-24

Apache Sparkでコール・オプション価格の分散処理計算 with Google Cloud Dataproc

| 13:50 | Apache Sparkでコール・オプション価格の分散処理計算 with Google Cloud Dataprocを含むブックマーク

モンテカルロ法でコール・オプション価格 - My Life as a Mock Quantを流行りの分散処理環境Apache Sparkでやってみたという話。

コード書くのは一瞬なんだけど、依存関係周りの解消が辛かったので、積極的にコード残しておきたい。

下記コード+sbtファイルを用意してコンソールから、バイナリ作成、クラスタ起動、クラスタへジョブ投入が

sbt assembly
gcloud beta dataproc clusters create dataproc01
gcloud beta dataproc jobs submit spark --cluster dataproc01 --class App --jars spark-optionpricing-assembly-1.0.jar

なかんじでいける。計算終了後は

gcloud beta dataproc clusters delete dataproc01

で破産しないようにクラスタを殺す。

コード

プロジェクト全体

Scala部分のみ

import org.apache.spark.mllib.random.StandardNormalGenerator
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import scala.math

object App {
  def main(args: Array[String]) = {
    val random = new StandardNormalGenerator()
    // Monte Carlo setting
    val size = math.pow(10, 10).toInt
    // market information
    val volatility = 0.3
    val spotPrice = 100.0
    val rate = 0.01
    // option parameters
    val maturity = 5.0
    val strike = 102.0

    // Spart setting
    // For local use
    //val conf = new SparkConf().setAppName("Estimating Call option price").setMaster("local[*]")
    val conf = new SparkConf().setAppName("Estimating Call option price")
    val sc = new SparkContext(conf)

    //Monte Cralo
    val result = sc.parallelize(1 to size).map { i =>
      val noize =  volatility * math.sqrt(maturity) * random.nextValue()
      val drift = (rate - 0.5 * volatility * volatility) *  maturity
      val price = spotPrice * math.exp( drift + + noize )
      math.max(price - strike, 0.0)
    }.sum * ( math.exp( -rate * maturity) )/ size
    // Show result
    println("Option price is: " + result)
    sc.stop()
  }
}

参考

2016-01-18

モンテカルロ法でコール・オプション価格

| 04:57 | モンテカルロ法でコール・オプション価格を含むブックマーク

とりあえず慣れてるのからということで・・・Wolfram Alphaで出した結果と大体あってるので、これでよさげだ。

import scala.util.Random
import scala.math

object App {
  def main(args: Array[String]) = {
    val random = new Random()
    // Monte Carlo setting
    val size = math.pow(10, 5).toInt
    // market information
    val volatility = 0.3
    val spotPrice = 100.0
    val rate = 0.01
    // option parameters
    val maturity = 5.0
    val strike = 102.0
    //Monte Cralo
    val result = {for (i <- 1 to size) yield {
      val noize = volatility * math.sqrt(maturity) * random.nextGaussian()
      val drift = (rate - 0.5 * volatility * volatility) *  maturity
      val price = spotPrice * math.exp( drift + + noize )
      math.max(price - strike, 0.0)
    }}.sum * ( math.exp( -rate * maturity) )/ size
    // Show result
    println("Option price is: " + result)
  }
}

結果

Option price is: 27.24

2016-01-12

applyは()の糖衣構文なのか?

| 05:58 | applyは()の糖衣構文なのか?を含むブックマーク

そういうことっぽい。

scala> Seq(1,2,3)
res0: Seq[Int] = List(1, 2, 3)

scala> Seq.apply[Int](1,2,3)
res1: Seq[Int] = List(1, 2, 3)

参考