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() } }