Last active
February 3, 2026 20:19
-
-
Save dacr/7aab1cd66bb7a3456ad926b00cfa01b7 to your computer and use it in GitHub Desktop.
Download DJI historical data - The (mis) behavior of markets : A fractal view of Risk, Ruin and Reward - Benoît Mandelbrot / published by https://github.com/dacr/code-examples-manager #080ee523-beff-42da-a5d3-dc386ad56e9e/387ccd29170417c1ec84099e9f143817533ecd2d
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // summary : Download DJI historical data - The (mis) behavior of markets : A fractal view of Risk, Ruin and Reward - Benoît Mandelbrot | |
| // keywords : scala, stocks, data, dji, download | |
| // publish : gist | |
| // authors : David Crosson | |
| // license : Apache License Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) | |
| // id : 080ee523-beff-42da-a5d3-dc386ad56e9e | |
| // created-on : 2021-01-30T13:09:43Z | |
| // managed-by : https://github.com/dacr/code-examples-manager | |
| // execution : scala ammonite script (http://ammonite.io/) - run as follow 'amm scriptname.sc' | |
| import $ivy.`com.lihaoyi::requests:0.6.5` | |
| import $ivy.`com.github.pathikrit::better-files:3.9.1` | |
| import $ivy.`org.json4s::json4s-jackson:3.6.10` | |
| import $ivy.`org.json4s::json4s-ext:3.6.10` | |
| import better.files._ | |
| import org.json4s._ | |
| import org.json4s.ext.{JavaTimeSerializers, JavaTypesSerializers} | |
| import org.json4s.jackson.Serialization.write | |
| import java.nio.charset.Charset | |
| import java.time.LocalDate | |
| import java.time.format.DateTimeFormatter | |
| import scala.util.Properties.envOrNone | |
| implicit val chosenFormats = DefaultFormats.lossless ++ JavaTimeSerializers.all ++ JavaTypesSerializers.all | |
| val djicsv = envOrNone("TMBOM_DJI_CSV").getOrElse("tmbom_dji.csv") | |
| val djijson = envOrNone("TMBOM_DJI_JSON").getOrElse("tmbom_dji.json") | |
| val autoRefresh = envOrNone("TMBOM_DJI_CSV_AUTO_REFRESH").getOrElse("false").toBoolean | |
| val charset = Charset.forName("UTF-8") | |
| val dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd") | |
| val djiFile = djicsv.toFile | |
| if (autoRefresh || djiFile.notExists) { | |
| for {out <- djiFile.newOutputStream.autoClosed} { | |
| requests | |
| .get("https://stooq.com/q/d/l/", params = Map("s" -> "^dji", "i" -> "d")) | |
| .writeBytesTo(out) | |
| } | |
| } | |
| case class Entry(date:LocalDate, open:Double, high:Double, low:Double, close:Double, volume:Option[Long]) | |
| def convert(input:String):Option[Entry] = { | |
| input.split(",") match { | |
| case Array(date, open, high, low, close) => | |
| val d = LocalDate.parse(date, dateFormat) | |
| val e = Entry(d, open.toDouble, high.toDouble, low.toDouble, close.toDouble, None) | |
| Some(e) | |
| case Array(date, open, high, low, close, volume) => | |
| val d = LocalDate.parse(date, dateFormat) | |
| val e = Entry(d, open.toDouble, high.toDouble, low.toDouble, close.toDouble, Some(volume.toLong)) | |
| Some(e) | |
| case x => | |
| println("Can't process : "+x.mkString(",")) | |
| None | |
| } | |
| } | |
| val entries = { | |
| djiFile | |
| .lineIterator | |
| .to(LazyList) | |
| .tail | |
| .flatMap(convert) | |
| } | |
| for { | |
| out <- djijson.toFile.newOutputStream.autoClosed | |
| entry <- entries | |
| } { | |
| out.write(write(entry).getBytes(charset)) | |
| out.write('\n') | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment