0

aとbの2つのベクトルがあります。添付資料参照。

aは信号であり、は確率です。 b次の期間の絶対変化率です。

Signalt <- seq(0, 1, 0.05)

ベクトルの各中間5%タイル()内で発生する最大絶対リターンを見つけたいと思いますSignalt。だからもしそうなら

  0.01, 0.02, 0.03, 0.06 0.07 

次に、間の最大リターンを計算する必要があります

     0.01 and 0.02, 
     0.01 and 0.03, 
     0.02 and 0.03. 

次に、に移動します

     0.06 and 0.07 do it over etc. 

シーケンス全体が実行されると、出力はマトリックスまたはテーブルに結合されます。

ベクトルaとbのインデックスに従う必要があります。

iaは、新しいパーセンタイルに交差するたびに1つずつ更新されるインデックスです。thクロスt(i)に関連付けられたバケットです。i

a長さがtaoの確率ベクトルです。このベクトルは、5%のタイルで分析する必要があり、最大の中間絶対リターンが出力になります。次の期間の価格変動はベクトルbです。これは、次の式でPで表されます。 lおよびmはインデックスです。

Signalが1つの5%タイルから別のタイルに移動するたびに、Signalが別の5%タイルに移動するまで、任意の2つの中間バケット間で発生する最大の絶対リターンを計算します。たとえば、Signalが85パーセンタイルに移動し、4つのボリュームバケットが後で90パーセンタイルに移動するとします。次に、バケット1と2、1と3、1と4、2と3、2と4、3と4の間の絶対リターンを計算します。最大絶対リターンに関心があります。次に、次のパーセンタイルバケットの最大リターンを計算し、次のバケットに移動します。これは、85パーセンタイルなどになります。したがって、Signalが1つのパーセンタイルから別のパーセンタイルに移動するたびに1ずつ更新されるインデックスをiとし、τ(i)はi番目のクロスに関連付けられたバケットとします。

これは私が使用している方程式です。表記は若干異なる場合があります。 方程式

今私の質問はこれについてどうやって行くかです。おそらく誰かがこれに対する直感的な解決策を持っています。私の質問が明確であることを願っています。

"a","b"
0,0.013013698630137
0,0.0013522650439487
0,0.00135409614082593
0,0.00203389830508471
0.27804813511593,0.00135317997293627
0.300237801284318,0
0.495965075167796,0.00405405405405412
0.523741892051237,0.000672947510094168
0.558753750296458,0.00202020202020203
0.665762829019002,0.000672043010752743
0.493106479913899,0.000671591672263272
0.344592579573497,0.000672043010752854
0.336263897823707,0.00201748486886366
0.35884763774257,0.00536912751677865
0.23662807979007,0.00133511348464632
0.212636893966841,0.00267379679144386
0.362212830513403,0.000666666666666593
0.319216408413927,0.00333555703802535
0.277670854167344,0
0.310143323100971,0
0.374104373036218,0.00267737617135211
0.190943075221511,0.00268456375838921
0.165770070508112,0.00200803212851386
0.240310208616952,0.00133600534402145
0.212418038918236,0.00200133422281523
0.204282022136019,0.00200534759358306
0.363725074298064,0.000667111407605114
0.451807761954326,0.000666666666666593
0.369296011692801,0.000666222518321047
0.37503495989363,0.0026666666666666
0.323386355686901,0.00132978723404265
0.189216171830472,0.00266311584553924
0.185252052821193,0.00199203187250996
0.174882909380997,0.000662690523525522
0.149291525540782,0.00132625994694946
0.196824215268048,0.00264900662251666
0.164611993131396,0.000660501981505912
0.125470998266484,0.00132187706543285
0.179999532586703,0.00264026402640272
0.368749638521621,0.000658327847267826
0.427799340926225,0
4

2 に答える 2

2

質問の私の解釈

私はあなたの質問を正しく理解することを望みます。これが私が理解したことです:

  1. 各行について、それが属する5%パーセンタイルを計算します
  2. そのパーセンタイルが変更されるたびに、新しいバケットを開始します
  3. 同じバケットのすべての行は、単一の結果値になります
  4. バケットに行が1つしかない場合b、その行の値が結果の値になります
  5. abs(b[l]/b[m]-1)それ以外の場合は、すべての場所を計算しm<l、両方が同じバケットに属します

基本的な答え

コード

このコードは、私が上で説明したことを実行します。

# read the data (shortened, full data in OP)
d <- read.table(textConnection("a,b
0,0.013013698630137
[…]
0.427799340926225,0
"), sep=",", header=TRUE)

# compute percentile number for each line    
d$percentile <- floor(d$a/0.05)*5 + 5

# start a new bucket whenever the percentile changes
d$bucket <- cumsum(c(1, diff(d$percentile) != 0))

# compute a single number for all rows of the same bucket
aggregate(b ~ percentile + bucket, d, function(b) {
  if(length(b) == 1) return(b); # special case of only a single row
  m <- outer(b, b, function(pm, pl) abs(pl/pm - 1)) # compare all pairs
  return(max(m[upper.tri(m)])) # only return pairs with m < l
})

出力

結果は次のようになります。

   percentile bucket            b
1           5      1 0.8960891071
2          30      2 0.0013531800
3          35      3 0.0000000000
4          50      4 0.0040540541
5          55      5 0.0006729475
6          60      6 0.0020202020
7          70      7 0.0006720430
8          50      8 0.0006715917
9          35      9 2.0020174849
10         40     10 0.0053691275
11         25     11 1.0026737968
12         40     12 0.0006666667
13         35     13 0.0033355570
14         30     14 0.0000000000
15         35     15 0.0000000000
16         40     16 0.0026773762
17         20     17 0.2520080321
18         25     18 0.5010026738
19         40     19 0.0006671114
20         50     20 0.0006666667
21         40     21 3.0026666667
22         35     22 0.0013297872
23         20     23 0.7511597084
24         15     24 0.0013262599
25         20     25 0.7506605020
26         15     26 0.0013218771
27         20     27 0.0026402640
28         40     28 0.0006583278
29         45     29 0.0000000000

追加の列

コード

各グループのアイテム数も知りたい場合は、plyrライブラリを使用することをお勧めします。

library(plyr)

aggB <- function(b) {
  if(length(b) == 1) return(b)
  m <- outer(b, b, function(pm, pl) abs(pl/pm - 1))
  return(max(m[upper.tri(m)]))
}

ddply(d, .(bucket), summarise,
      percentile = percentile[1], n = length(b), maxr = aggB(b))

出力

これにより、次の結果が得られます。

   bucket percentile n         maxr
1       1          5 4 0.8960891071
2       2         30 1 0.0013531800
3       3         35 1 0.0000000000
4       4         50 1 0.0040540541
5       5         55 1 0.0006729475
6       6         60 1 0.0020202020
7       7         70 1 0.0006720430
8       8         50 1 0.0006715917
9       9         35 2 2.0020174849
10     10         40 1 0.0053691275
11     11         25 2 1.0026737968
12     12         40 1 0.0006666667
13     13         35 1 0.0033355570
14     14         30 1 0.0000000000
15     15         35 1 0.0000000000
16     16         40 1 0.0026773762
17     17         20 2 0.2520080321
18     18         25 3 0.5010026738
19     19         40 1 0.0006671114
20     20         50 1 0.0006666667
21     21         40 2 3.0026666667
22     22         35 1 0.0013297872
23     23         20 3 0.7511597084
24     24         15 1 0.0013262599
25     25         20 2 0.7506605020
26     26         15 1 0.0013218771
27     27         20 1 0.0026402640
28     28         40 1 0.0006583278
29     29         45 1 0.0000000000
于 2013-02-05T20:39:55.743 に答える
1

よくわかりませんが、ここで試みます。私の考えは、データを百分位数でグループ化することです。by

  1. データをグループ化するには、新しい変数分割を作成します

    ##dat$split <- cut(dat$a,seq(0, 1, 0.05),include.lowest=T)
    
    dat$split <- c(0,cumsum(diff(dat$a) > 0.05))
    
  2. byを使用すると、各グループで機能を実行できます。NULL確率値または1つの値の特異なケースを削除します。

    by(dat,dat$split,FUN =function(x){
      P <- x$b
      if( is.null(P)||length(P) ==1) return(0)
      nn <- length(P)
      ind <- expand.grid(1:nn,1:nn)     ## I generate indexes here
      ret <- abs(P[ind[,1]]/P[ind[,2]]-1)   ## perfom P_l/P_m-1  (vectorized)
      list(P=P,
           ret.max = max(ret),
            ret.ind = ind[which.max(ret),])
    })
    

ここに結果リストがあります。私が示す間隔ごとに、

  • P(確率値)、
  • 最大リターン
  • この最大値が計算されるインデックス。

例えば:

dat$split: 0
$P
[1] 0.0130 0.0014 0.0014 0.0020

$ret.max
[1] 8.6236

$ret.ind
  Var1 Var2
5    1    2

--------------------------------------------------------------------------------------------------------------- 
dat$split: 1
$P
[1] 0.0014 0.0000

$ret.max
[1] 1

$ret.ind
  Var1 Var2
2    2    1
于 2013-02-05T19:58:18.140 に答える