fillは shallow copy (浅いコピー)作るので危険

めちゃハマったのでメモ。

julia> mutable struct Hoge
           x::Int
       end

julia> xs = fill(Hoge(10), 2)
2-element Array{Hoge,1}:
 Hoge(10)
 Hoge(10)

julia> xs[1].x = 333
333

julia> xs[2].x
333

内包表現(でいいのか?)使うならおk。

julia> xs = [Hoge(10) for _ in 1:2]
2-element Array{Hoge,1}:
 Hoge(10)
 Hoge(10)

julia> xs[1].x = 333
333

julia> xs[2].x
10

Sys.getenv()の結果をdata.frameとして扱いたい

Dlistというクラスのオブジェクトになっていて使いにくい。

> x <- Sys.getenv()
> class(x)
[1] "Dlist"

しょうがないんで、これをdata.frameとして返却する関数を書いた。

get_env <- function(x=NULL)
{
  env <- Sys.getenv(x)
  class(env) <- NULL
  env <- as.data.frame(env, stringsAsFactors=FALSE)
  env <- cbind(rownames(env), env)
  rownames(env) <- NULL
  names(env) <- c("key", "value")
  env  
}

これを使うと、環境変数をdata.frameとして取得でき、更にdplyr & stringrと組み合わせることで楽にフィルタリングできる。

> x <- get_env()
> class(x)
[1] "data.frame"
> dplyr::filter(x, stringr::str_detect(key, "(COMPUTERNAME|DISPLAY)"))
           key           value
1 COMPUTERNAME LAPTOP-S5NHVV53
2      DISPLAY              :0

このあたりの”tidy Sys"系関数はパッケージングされてるのかな?なければ作ってもよい気がしてきた。
おしまい。

R MarkdownでTwo Column(2列)なレポートを作りたい

将来的にオレオレJulia v.s. Rチートシートを作るための礎。
主にこちらのStackoverflowを見て適当にCSSコピペった。

以下のMarkdown

のような形でHTMLになる。
この左右どちらかをJuliaのengineに帰ればHTML版のチートシートは作れるぞと。

---
title: "Two column R markdown"
author: "Nagi Teramo"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

<style>
.column-left{
  float: left;
  width: 47.5%;
  text-align: left;
}
.column-right{
  float: right;
  width: 47.5%;
  text-align: left;
}
</style>


<div class="column-left">
## Left hand side
```{r}
print("Hello, left side")
```
</div>
<div class="column-right">
## Right hand side
```{r}
print("Hello, right side")
```
</div>

Windows Subsystem for LinuxにJuliaを入れる

諸事情により手を出す&マシン新調予定なのでメモ。
今はWSLっていって、もうBash on Windowsって名前じゃなくなってたんだな。

WindowsBashからhttps://julialang.org/downloads/のGeneric Linux Binaries for x86wgetして、解凍して、名前変えておしまい。
こんなかんじ

$ wget https://julialang-s3.julialang.org/bin/linux/x64/0.6/julia-0.6.2-linux-x86_64.tar.gz
$ tar zxvf julia-0.6.2-linux-x86_64.tar.gz
$ mv julia-d386e40c17/ julia
$ rm julia-0.6.2-linux-x86_64.tar.gz
$ julia/bin/julia
               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: https://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.6.2 (2017-12-13 18:08 UTC)
 _/ |\__'_|_|_|\__'_|  |  Official http://julialang.org/ release
|__/                   |  x86_64-pc-linux-gnu

julia>

0.6.2系が入った。


IJuliaのインストール

これも素直にJuliaのコンソールから

julia> Pkg.add("IJulia")

でおしまい。
途中動いてんのかフリーズしてんのかわからんくらい待たされた気がする。
Notebookは↓で起動&Jupyter同様デフォルトだと8888ポートで起動している。

julia> notebook(detached=true)
Process(setenv(`/home/teramonagi/.julia/v0.6/Conda/deps/usr/bin/jupyter notebook --NotebookApp.iopub_data_rate_limit=2147483647`; dir="/home/teramonagi"), ProcessRunning)

とりあえず動くのまでは確認。

外国債券(為替ヘッジなし)のリスクは、ほとんど為替から来るという話

掲題の件、ちゃんと数式にしておく。
以下、使うものの定義

  • (お持ちになられている)外国債券の時点tでの現地通貨建て価格(面倒なのでUSD仮定):  P_{USD}(t)
  • (お持ちになられており、日々一喜一憂しているであろう)外国債券の時点tでの円建て価格:  P_{JPY}(t)
  • 時点tでのUSDJPYレート: USDJPY(t)
  • 日次リターン(P(t)はある価格、tは日付を仮定): R(t) = P(t)/P(t-1) - 1
  • 日次リスク(リスク=標準偏差で定義、stdevは標準偏差):  Risk(t) = stdev(R_t)


まず、外国債券価格(円・ドル建て)の間には以下の関係が成立する。
これは「証券価格を表示する通貨を変更しますよ〜」というだけなので、自明である。
 P_{JPY}(t) = P_{USD}(t) \times USDJPY(t)

従って、外国債券(円建て)のリターンは
 R_{JPY}(t) = P_{JPY}(t)/P_{JPY}(t-1) - 1 = \frac{P_{USD}(t)USDJPY(t)}{P_{USD}(t-1)USDJPY(t-1)} -1=(1+R_{USD}(t))(1+R_{USDJPY}(t)) - 1
となる。正しここで、

  •  R_{USD}(t) : 外国債券(ドル建て)
  •  R_{USD}(t) : USDJPYレートのリターン


である。更に上式は
 R_{JPY}(t) = (1+R_{USD}(t))(1+R_{USDJPY}(t)) - 1 = R_{USD}(t) + R_{USDJPY}(t) + R_{USD}(t)\times R_{USDJPY}(t)
と整理できる。
さて、通常、 R_{USD}(t)\times R_{USDJPY}(t) R_{USD}(t), R_{USDJPY}(t)に比べて小さい(日次のリターンは%のオーダーなので、100分の1程度小さくなると期待できる)ので、無視できるとすると、

 R_{JPY}(t) = R_{USD}(t) + R_{USDJPY}(t)

となり、”外国債券(円建て)のリターンは外国債券(ドル建て)と為替(USDJPY)リターンの和になる”という綺麗な関係式が得られる。

従って、外国債券(円建て)のリスクは

 Risk_{JPY}(t) = stdev(R_{USD}(t) + R_{USDJPY}(t)) = \sqrt{stdev(R_{USD}(t))^2 + stdev(R_{USDJPY}(t))^2 + 2 \rho \cdot stdev(R_{USD}(t)) stdev(R_{USDJPY}(t)) }

となる。ただし \rhoは”外国債券(USD建て)のリターンと為替(USDJPY)リターンの相関”である。

上式の√の中で何が(通常)支配的にふるまうかというと、為替(USDJPY)のリスク stdev(R_{USDJPY}(t))なんでまぁそういうことなんです。

paste0()を捨てたい

文字列を結合するときに使う paste0()を捨てたくて、

`%+%` <- function(x, y){paste0(x, y)}

を定義してみた。
こんな感じで使う。

> "hoge" %+% "moge"
[1] "hogemoge"


うれしい・・・かな?
tidyverseあたりに出てきてもよさそうな機能なんだが、出てきたという話を聞いたことがないな。

bitFlyer LightningのAPIをRから使う

"何でもRでやるおじさん日本代表(タヒチ在住)"として、いい加減書いておかねばならないと思った。
まずは、APIキーを頑張って以下から取得してください。

そして、その情報とbitFlyerのURLをなんでもいいんだけど適当な変数に入れておく。

BITFLYER_KEY <- "<your key>"
BITFLYER_SECRET <- "<your secret>"
BITFLYER_URL <- "https://api.bitflyer.jp"

で、早速データを取得する。
まず、PublicのAPIの場合だが、この場合、APIキーの情報はいらない。

例えばBitcoinの板情報はこんな感じで取得+Rっぽく処理しておくといいだろう。
必要になるhttr, dplyr, purrrパッケージは適当にインストールしておいてください。

> content <- httr::content(httr::GET(paste0(BITFLYER_URL, "/v1/board")))
> dfl <- purrr::map(content[-1], ~ dplyr::bind_rows(.x))
> dfl
$bids
# A tibble: 3,387 x 2
     price   size
     <dbl>  <dbl>
 1 1974375 0.0060
 2 1974370 1.0013
 3 1974020 0.3000
 4 1974000 0.1090
 5 1973982 0.0010
 6 1973981 0.0010
 7 1973825 1.5000
 8 1973557 0.0020
 9 1973100 0.0100
10 1973010 0.2000
# ... with 3,377 more rows

$asks
# A tibble: 1,686 x 2
     price      size
     <dbl>     <dbl>
 1 1975486 0.0090000
 2 1975490 0.2390648
 3 1975491 1.4850191
 4 1976989 0.0010000
 5 1977000 1.0549186
 6 1977003 0.3000000
 7 1977781 2.0000000
 8 1978000 0.1999200
 9 1978100 0.6500000
10 1978117 1.1134800
# ... with 1,676 more rows

ちょっと面倒なのはPrivate APIで、これは公式ドキュメントに以下のようにせにゃならんと書いてある
公式サンプルがNode.jsだったので、これをRで書き直した。
以下の例だと自分の口座情報が取得できます。
digestパッケージはまた別途入れておいてください。

# APIのパス
path <- "/v1/me/getbalance"
# unix time stamp
timestamp <- as.numeric(Sys.time())
# 作れと言われてるSign
sign <- digest::hmac(paste0(timestamp, "GET", path), key=BITFLYER_SECRET, algo="sha256", serialize=FALSE)
# ヘッダーに突っ込んでおくる
header <- httr::add_headers(
  `ACCESS-KEY`=BITFLYER_KEY,
  `ACCESS-TIMESTAMP`=timestamp,
  `ACCESS-SIGN`=sign,
  `Content-Type`="application/json"
)
httr::content(httr::GET(paste0(BITFLYER_URL, path), header))


次は発注すっか。