Hatena::ブログ(Diary)

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

2014-08-31

geom_lineとgeom_pathの違いに嵌る

| 08:36 | geom_lineとgeom_pathの違いに嵌るを含むブックマーク

あんまよくわかってなくて、酷い目に会いましたよと。まず、以下のようなシミュレーション結果「ある経路を表すx, y列を持つデータ」が手もとにあったとする。

> head(df)
         x        y
1 119.2424 14.39025
2 118.9490 14.94898
3 118.6767 16.27511
4 117.9835 17.21644
5 117.1884 18.28008
6 116.7007 19.68278

これを普通にplot関数で描画すると

plot(df$x, df$y, type="l")

f:id:teramonagi:20140831083452p:image:w480

となって、「あぁ、なるほどこういう経路をたどったのね」とわかる。一方、これと同様のことをggplot2のgeom_line関数を使って描画を行うと

ggplot(df, aes(x=x, y=y)) + geom_line()

f:id:teramonagi:20140831083451p:image:w480

となってなんじゃこりゃとなった。これはgeom_line関数が「xのデータ順に線を繋いでくれる」もんだから問題となるのであって、もともとやりたかった「経路」的なものを描画したい時は、その名の通りgeom_path関数を使う。

ggplot(df, aes(x=x, y=y)) + geom_path()

f:id:teramonagi:20140831083449p:image:w480


結局、いつまで経ってもggplot2は慣れないというお話。

2014-08-29

TOPIX(2013年)のカレンダープロット

| 22:16 | TOPIX(2013年)のカレンダープロットを含むブックマーク

お、おお、こんなのあるんだ。昔、似たような感じの話で

で試したコードよりも簡素化されていて大変よい。大変良いので真似てみた。

ここでは、今目下私が開発中のRFinanceYJパッケージを代替するようなパッケージ、その名もRFinanceJパッケージを使って、TOPIXデータを取得する*1

RFinanceJパッケージのインストールは、github経由で以下のように行う。devtoolsが既にあるならそこはインストールしなくても当然いい。

install.packages("devtools")
library(devtools)
install_github("teramonagi/RFinanceJ")
library(RFinanceJ)

データの取得は以下のような感じで。関数はrfinancejでもその省略系のrfjでもどちらでもOK。

dat <- rfj('998405.t', "data.frame", "2013-1-1", "2013-12-31", "daily", "yahoo")

取得したデータの日付列は"date"限定らしいので、そのように変更しておく。magrittrパッケージを使えば以下のようにスマートにかける!

library(magrittr)
#一列名の列名を"date"に変更
dat := setNames(c("date", colnames(dat)[-1]))

ここまでくればあとはopenairパッケージで簡単にカレンダープロットを作れる。

library(openair)
calendarPlot(dat, pollutant = "Close", year = "2013", cols="jet")

結果は↓。う、美しい、そしてアベノミクス万歳の一年であったことがわかる。

f:id:teramonagi:20140829190952p:image

*1:ちなみに、日本の金融経済系のいいデータソースをご存知でしたら教えてください

2014-08-24

やってみよう分析!Rで強化学習(Q-learning, ε-greedy行動選択)

| 06:57 | やってみよう分析!Rで強化学習(Q-learning, ε-greedy行動選択)を含むブックマーク

のR実装版。強化学習自体の解説は上の記事読んどいたらいい。めんどいのでとりあえずε-greedyのみやった。計算結果は

> Qlearning()
     [,1]     [,2]
[1,]    5 20.00000
[2,]   10  4.99903

となって、上のLINK先と同じなのでコードは間違ってなさそうだ。

以下、全コード。めんどいのでノーコメント。後で昔の俺が未来の俺の首を絞める可能性大だ。

#行動選択
selectAction <- function(s, numA, Qt)
{
  qa <- Qt[s,]
  max_indexes <- (1:length(qa))[qa==max(qa)]
  if(length(max_indexes) == 1){
    max_indexes
  }else{
    max_indexes[sample(length(max_indexes), 1)]
  }
}
epsilonGreedy <- function(epsilon, numA, s, Qt)
{
  if(runif(1) < epsilon)
  {
    sample.int(numA, 1)
  }else{
    selectAction(s, numA, Qt)
  }
}
nextState <- function(s, a)
{  
  ifelse(a==1, ifelse(s==1, 2, 1), s)
}
calcReward <- function(s, a, net)
{
  ifelse(a!=1 && s==1, net, 0)
}
Qlearning <- function()
{
  numA <- 2
  numS <- 2
  alpha <- 0.3
  gamma <- 0.5
  epsilon <- 0.1
  trialMax <- 10000
  stepMax <- 10
  net <- 10
  s = 1
  Qt <- matrix(0, numS, numA)
  
  for(i in 1:trialMax)
  {
    for(j in 1:stepMax)
    {
      a <- epsilonGreedy(epsilon, numA, s, Qt)
      sd <- nextState(s, a)
      reward <- calcReward(s, a, net)
      Qt[s, a] <- (1 - alpha)*Qt[s, a] + alpha*(reward + gamma*max(Qt[sd,]))

      if(reward > 0){
        s <- 1
        break
      } else{
        s <- sd        
      }
    }
  }
  Qt
}

2014-08-20

殺伐とした空気を吹き飛ばすアスキーアートなテラモナギ

| 21:22 | 殺伐とした空気を吹き飛ばすアスキーアートなテラモナギを含むブックマーク

なんか殺伐とした空気を吹き飛ばせるんじゃないか、そう強く感じさせるパッケージを2つみつけた。

まず、Githubからのインストール

library(devtools) 
install_github("wrathematics/Rfiglet")
install_github("sckott/cowsay")

Rfigletから使ってみる。

> library(Rfiglet)
> figlet("teramonagi")
 _                                                   _ 
| |_ ___ _ __ __ _ _ __ ___   ___  _ __   __ _  __ _(_)
| __/ _ \ '__/ _` | '_ ` _ \ / _ \| '_ \ / _` |/ _` | |
| ||  __/ | | (_| | | | | | | (_) | | | | (_| | (_| | |
 \__\___|_|  \__,_|_| |_| |_|\___/|_| |_|\__,_|\__, |_|
                                               |___/    
> figlet("teramonagi", font="broadway")
                                                                        
8888888 8888888888 8 8888888888   8 888888888o.            .8.          
      8 8888       8 8888         8 8888    `88.          .888.         
      8 8888       8 8888         8 8888     `88         :88888.        
      8 8888       8 8888         8 8888     ,88        . `88888.       
      8 8888       8 888888888888 8 8888.   ,88'       .8. `88888.      
      8 8888       8 8888         8 888888888P'       .8`8. `88888.     
      8 8888       8 8888         8 8888`8b          .8' `8. `88888.    
      8 8888       8 8888         8 8888 `8b.       .8'   `8. `88888.   
      8 8888       8 8888         8 8888   `8b.    .888888888. `88888.  
      8 8888       8 888888888888 8 8888     `88. .8'       `8. `88888. 
          .         .                                            
         ,8.       ,8.           ,o888888o.     b.             8 
        ,888.     ,888.       . 8888     `88.   888o.          8 
       .`8888.   .`8888.     ,8 8888       `8b  Y88888o.       8 
      ,8.`8888. ,8.`8888.    88 8888        `8b .`Y888888o.    8 
     ,8'8.`8888,8^8.`8888.   88 8888         88 8o. `Y888888o. 8 
    ,8' `8.`8888' `8.`8888.  88 8888         88 8`Y8o. `Y88888o8 
   ,8'   `8.`88'   `8.`8888. 88 8888        ,8P 8   `Y8o. `Y8888 
  ,8'     `8.`'     `8.`8888.`8 8888       ,8P  8      `Y8o. `Y8 
 ,8'       `8        `8.`8888.` 8888     ,88'   8         `Y8o.` 
,8'         `         `8.`8888.  `8888888P'     8            `Yo 
                                            
         .8.           ,o888888o.    8 8888 
        .888.         8888     `88.  8 8888 
       :88888.     ,8 8888       `8. 8 8888 
      . `88888.    88 8888           8 8888 
     .8. `88888.   88 8888           8 8888 
    .8`8. `88888.  88 8888           8 8888 
   .8' `8. `88888. 88 8888   8888888 8 8888 
  .8'   `8. `88888.`8 8888       .8' 8 8888 
 .888888888. `88888.  8888     ,88'  8 8888 
.8'       `8. `88888.  `8888888P'    8 8888  

cowsayパッケージにはAAがあるみたい。WinだとSys.setlocale(category = "LC_CTYPE", locale = "C")しておかないとうまく表示されなかった。

> library("cowsay")
> Sys.setlocale(category = "LC_CTYPE", locale = "C")
[1] "C"
> say('time')

 ----- 
 2014-08-20 21:20:06 
 ------ 
    \   ^__^ 
     \  (oo)\ ________ 
        (__)\         )\ /\ 
             ||------w|
             ||      ||

元ネタと例

2014-08-19

1:length(x) の代わりに seq_along(x) を使うと良いってごみ箱が言ってた

| 20:45 | 1:length(x) の代わりに seq_along(x) を使うと良いってごみ箱が言ってたを含むブックマーク

seq_alongの方が、空っぽのベクターに対しても安全に動作しますよっと。

> x <- 1:3
> 1:length(x)
[1] 1 2 3
> seq_along(x)
[1] 1 2 3
> x <- c()
> 1:length(x)
[1] 1 0
> seq_along(x)
integer(0)