53歳限界プログラマの憂鬱

SU/CAR-ST-APplication-cellsから派生したプログラマのブログ

来訪ありがとうございます
シストレツールを自作してました
自分用の記事が多いのであまり役には立たないブログでした

f:id:sucar:20150414193802p:plain

自作システム詳細目次

株価データの変換

株価データをcsvでDLできる某サイトがリニューアルして、ついでにcsvデータのフォーマットが変更になった模様

とりあえず、旧仕様フォーマットに変更するスクリプトawkで作成

--------------------------------

#!/bin/awk
BEGIN {
  FS=","
  print "new2old"
  print "コード,市場,銘柄名,業種,始値,高値,安値,終値,出来高,売買代金"
}
# 1行目を無視
NR>1 {
  printf("%s,",$1)
  printf("%s,",$3)
  printf("%s,",$2)
  printf("dummy,")
  if ($4=="") {printf("-,")}
  else {printf("%s,",$4)}
  if ($5=="") {printf("-,")}
  else {printf("%s,",$5)}
  if ($6=="") {printf("-,")}
  else {printf("%s,",$6)}
  if ($7=="") {printf("-,")}
  else {printf("%s,",$7)}
  printf("%s,",$8)
  printf("%s\n",$9)
}

END {}

----------------------------------------

これで急場は凌げそう

if ~ else ~と ifelse の違い

ifelse(x>0,1,0)

 と

if (x>0) {
 1
} else { 
 0
}

の根本的な違いは?

x<-0として実行してみると

> x<-0
> ifelse(x>0,1,0)
[1] 0
> if (x>0) {
+ 1
+ } else {
+ 0
+ }
[1] 0

同じ結果が返ってくるが

x<-0:9 とベクトルで試してみると違いが出てくる

> x<-0:9
> ifelse(x>0,1,0)
[1] 0 1 1 1 1 1 1 1 1 1
> if (x>0) {
+ 1
+ } else {
+ 0
+ }
[1] 0
Warning message:
In if (x > 0) { :
the condition has length > 1 and only the first element will be used

ifelseはちゃんとベクトルで返ってくるけど、if ~ else ~はベクトルの最初だけ実行してあとは実行しないで警告が発生する

うまく説明できないけど

ifelseはオブジェクトというか関数というかそういうもんで

if ~ else ~は制御文

プロンプトから

>ifelse

って打てば、ifelse関数の中身のソースが表示されるけど

>if

って打つと

となって「完結してないので続きを」となる

うまく説明できないけど、、、

例えば、エクセルでセルに=if(A1>0,1,0)とかif関数を入力できるけど、これをセルにずーっとコピーして、=if(A2>0,1,0) =if(A3>0,1,0) ・・・ってやつがベクトル化ってこと

ifelseにベクトルを渡すのはこのようにエクセルでセルにコピーしてると考えるとわかりやすいかも(イメージ的に)

if ~ else ~ の方は、エクセルのセルに入れられないからベクトルを渡すことができない

まったくうまく説明できないけど、、、

この辺の感覚が理屈抜きで身につけば、R言語スキルもちょっとは上がってきてるのかもね

コマンドmn() bx() on su/car -r

R言語環境上で解析&検討する」su/car -r  での 基本コマンドの使い方をメモっておく(完全に自分用記事だなこれは、、、m(_ _)m)

(2016/3/21 改定)
bx(p,x指値%,sng損切%,rkk利確%,cnt,op)

箱ひげ図を出力

f:id:sucar:20160320193704p:plain

(2016/3/21 改定)
mn(p,x指値%,sng損切%,rkk利確%,cnt,op)

平均値をplot

f:id:sucar:20160320193828p:plain

パラメータは

p:表示するデータフレーム pはルール適用後

x:指値%:正の数で与える 0または省略すると寄成

sng:損切%:正の数で与える 0または省略すると損切なし

rkk:利確%:正の数で与える 0または省略すると利確なし

(2016/3/21改定)
cnt:コントロール 省略すると0

  0:通常(損切優先)

  1:利確優先

  2:当日損切なし&翌日以降損切優先

  3以上:当日損切なし&利確優先

op:オプション 省略すると0

  0:通常(指値時当日は高値を終値で代用する)

  1:強制的に当日高値を有効にする

  2以上:当日は利確しない

こんな感じ

あと、実行すると

> mn(p,3,0,5)
約定率   損切発生  利確発生   翌日不成   翌々日不成
29.7397770  0.0000000  31.2500000  0.8577256  1.2054492

こんな感じでベクトルを返す

なので

>a<-NULL

> for (i in 0:15) {

+ ans <-mn(p,0,i,15)
+ a[i+1]<-ans[5]}
> a
[1] 0.7863281 0.3537703 0.5211276 0.5715498 0.4777952 0.5135675 0.6018006
[8] 0.5429220 0.6950764 0.6208076 0.7104011 0.6701910 0.6602877 0.7179250
[15] 0.6836140 0.6981739
> plot(a)

こんな感じにその場プログラム作成&実行できるw

f:id:sucar:20160320195624p:plain

※損切なし~15%で損切まで振ってみて期待値をグラフ化

(もっとも厳密にシミュレーションできないせいか、損切なしの方が期待値高いことが多いが)

※ 段々、普通のR使いになっていく感じがするw なるほど便利だね

 (2016/3/21追記 いろいろ弄っている最中なので返りベクトルもちょっと変えているの注意)

su/car -r 「R言語環境上で解析&検討する」

$su/car -r で「R言語環境上で解析&検討する」ことができるようになったので、自分用の備忘録的に書いていくことにする

f:id:sucar:20160320121814p:plain現在のスクショ↑

現在のコマンド

i()  info 簡単な基本コマンド一覧が出る

d()  データを読み込む

  例えばd(2008) で2008年のデータが読み込めるがそういう準備をしてるだけ
  追ってもう少し整理したい

r(x)  ルールxを適用 

  運用中のルールが適用される
  もう少し整理してテストルール(運用に影響されない)の運用とか考えたい

mn(p)  ルール適用後のデータフレーム(=p)の価格変動平均をグラフ化

bx(p)   ルール適用後のデータフレーム(=p)の価格変動の箱ひげ図をグラフ化

mnもbxも 指値%,損切%,利確%を引数として渡せるが、利確%については現在グラフには影響しない 戻り値には影響する

※2016/3/20現在 戻り値が正しいか不明 少なくとも前作った関数と違う値が返ってくる(特に利確%が怪しい?) 

 

「R言語環境上で解析&検討する」はどうなった?

年初に 

て、記事書いて、R言語環境上で全部やった方が、、、、って思ってたんだけど、ようやく進展したので、ちょっと書いておく

まず、

$su/car -r

と、rオプションを付けて起動するとR言語環境であるRguiが立ち上がるようにしておく(とりあえず、最後セーブしないようにしてるが、履歴もセーブしないようなのでちょっと困ってはいる) 

(2016/3/20 追記) とりあえず --no--save は外して終了時セーブするかダイアログを出すようにしている

------------

#!/bin/bash
echo cd `dirname $0`
cd `dirname $0`
pwd
#http://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb
b=1
while getopts bmwhdplr OPT
do
case $OPT in
  (中略)
r) echo Rgui --no-save &
  echo cd ./R
  cd ./R
  #Rgui --no-save &
  Rgui &

b=0;;

esac
done

------------

で、./R ディレクトリに .Rprofile を置いておく

中身は

source("./sucar_base.R")

で、本体は./sucar_base.R

に書いておく

これで、

supercar.hatenablog.com

自作関数をいろいろ作っていけば、それを実行することで、解析&検討ができるという仕組み

立ち上げたあと一度データを読み込めば、あとはかなり高速に処理できるし、グラフを見ながらいろいろできるので非常に便利

 

now07.cとanaint07.cの統合

検証用のデータフレームを出力するanaint07.cと 

本日の買いシグナルを出すためのデータフレームを出力するnow07.c 

は中身がほとんど同じなので、ソースとして統合することにした

統合したソースは

anaint07a.c (中身は省略)として

carmk の中で

-------------------

gcc anaint07a.c -o ../bin/anaint07.exe
gcc -DNOW anaint07a.c -o ../bin/now07.exe

------------------

と、NOWを定義してコンパイルするとnow07.exeを生成するようにした

これで今後の出力パラメタの変更、追加が楽になるはず

 

only~ 先頭〇個だけsum/mean(R言語自分用メモ)

シストレ検証用ソフトを作ってて、ある条件のトレードを抽出、結果を集計し、期待値が~、PFが~、資産曲線グラフが~、、、、

ってやっているわけですけど

たとえば、ある日に100個も買いシグナルが出て、とかの場合、全部トレードするには相当な資金力が必要になるのですが、まあ無理なので、そこも考慮しないといけない

で、資金を設定し、厳密にシミュレーションすればいいけど、まあ、ちょっと簡単に傾向だけみたいので、、、、 

と、折角ソートしたので、データの先頭〇個だけ処理すれば、ある程度資金限定はできる(厳密ではないが)

ということで新しく以下の関数を作成

先頭y個だけのデータを処理してくれる

-----------------------------------

#データべクトルxの先頭y個のみ処理

onlymean <-function (x,y) {
n<-length(x)
names(x)<-1:n
mean(x[1:y],na.rm=TRUE)
}

onlysum <-function (x,y) {
n<-length(x)
names(x)<-1:n
sum(x[1:y],na.rm=TRUE)
}

---------------------- 

nemes()で先頭から番号を振り、番号順1~yだけ処理する

names()を使う発想が出るようになったので、ちょっとはR言語使いなった感じがするw