2009年1月9日金曜日

今日の戦績

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

---------------------------
トータル損益は+5396円です。

このうち手数料の支払いが1104円含まれます。

買い注文回数は12回, 売り注文回数は11回です。

未返済の建て玉0枚の見込み損益は手数料を含まずに±0円です。


---------------------------
OK
---------------------------

夕場で火遊びして一勝二敗で割りと大きな損を出してしまった。だから動きがない所に成り行き注文で参加すれば100%損するんだって何度言ったら分かるんだこいつは。8800Sとかクリックした瞬間に自分の正気を疑った。でも、環境最悪なのも事実なので、持ち越したら爆益だった気がしなくもないが、それでもオーバーウィークエンドのリスクとつりあうものじゃないと、さすがにそれは学習したので指成で手仕舞った。引けで直前の売り気配値から2ティックも上げやがったよクソッタレ。

今日の夕場みたいな状況で参戦するなら8805L-8825Sを繰り返すってのはありなんだろうけど、そういう揉みあい相場の戦術はトレンドフォローの基本を身に付けてからにしようと心に決めている。

とにかく三連勝は喜ばしい。

Lv1.00(平均の取引枚数。整数部がmini発注可能枚数の半分の切り上げ値)
---------------------------

---------------------------
トータル損益は+8684円です。

このうち手数料の支払いが816円含まれます。

買い注文回数は9回, 売り注文回数は8回です。

未返済の建て玉0枚の見込み損益は手数料を含まずに±0円です。


---------------------------
OK
---------------------------


後場は前場の下げを半値戻した後少しずつ下げるというストーリーが一応ありそうに見えて、結局高ボラティリティでランダムウォーク頼みに意味ありげな見せかけの相場が作られるという何ともやりにくい展開。それでも全体的には初め上げた後は下げる傾向だったので、初めの上げに付き合わず、その後要所要所でショートして利益を膨らませる事ができた。これで三連勝。

それにしても、時間の平方根を取って時間軸にして相場を見ていると上げたり下げたりという基本的なストーリーは同じでも、普通にチャートを見るのと全然違うストーリーが読み取れて実に面白い。直近の値動きは未来に対して不確定に寄与して、それが段々と過去のデータになるに従い結局はランダムウォークの範疇のブレとしてトレンドの中に飲み込まれていったり、次第にただの一時的なリバウンドに見えた物が積み重なって新しいトレンドを作っていったりと確定したトレンドを形成していく。固定された時間軸では分からない、データの相場に対して持つ「意味」が、データが過去の物になるにつれてダイナミックに変化していって、トレンドがダイナミックに形成されていく、その様子が「身も蓋もない」を使うと良く分かる。多分、「身も蓋もない」のユーザは、世界中のどんなトレーダとも違う景色を身ながらトレードを行う事になる。

Lv1.00(平均の取引枚数。整数部がmini発注可能枚数の半分の切り上げ値)
---------------------------

---------------------------
トータル損益は+4568円です。

このうち手数料の支払いが432円含まれます。

買い注文回数は5回, 売り注文回数は4回です。

未返済の建て玉0枚の見込み損益は手数料を含まずに±0円です。


---------------------------
OK
---------------------------


以下前場に書いた事:
昨日の夕場から持ち越した8880の売り建て玉よりかなり高く始まって、前場開始後さらに少し上げた後の100円ひたすら下げるという美味しいところを見ている事しかできない展開。結局昨日夕場引けと同じ8855で利確できたけど、これは結果論でなしに、昨日利確しておくべきだったなあ。夕場の取引なんて半分以上洒落なんだから、+25で御の字だよ。

その後は下げてはリバウンドするというやりやすい展開だけど割りと手堅く攻めたので5000円強程度の利益。まあ強い下げに付いていけなかったとも言う。その後8800から駄目押しのショートが上手くいかなくて損きりしたのち8100円で売って8000円での手仕舞いで少しだけそれを取り戻して前場終了。

後場がやりにくいなあ。25MAはまだ下にあるけれど、ここからさらに一段の下げをすると決め付けられる程に市場の感情は悪くない。環境は最悪なんだけど。一方でここから大きくリバウンドする展開も想像しにくい。いくらトレンドフォローとは言え、ここからの上げに付き合う気にはなれない。そもそも今日の寄り高が昨日の下げの半値戻しという形なわけだし。後場が高く寄り付いてそこから下げる展開でなければ後場は参戦を我慢する事の練習になるかな。

それにしても、今日くらい大きな値幅で一方的に動く展開でもこれくらいしか利益が出せないんだから、出来高が細ったり方向感が乏しくボラティリティ頼みで相場が形成されていく日に無理に参戦する癖は本当に慎まないと。勝つ時は4000円~7000円、負ける時は一気に一万円二万円じゃあ折角勝ち続けてもすぐに帳消しになってしまう。あと、やっぱり大きな損を防ぐためにも損きりルールも決めた方が良いなあ。「実も蓋もない」に搭載するかな。

2009年1月8日木曜日

今日の戦績

Lv1.00(整数部がmini発注枚数の半分の切り上げ値)
---------------------------

---------------------------
トータル損益は+4992円です。

このうち手数料の支払いが1008円含まれます。

買い注文回数は10回, 売り注文回数は11回です。

未返済の建て玉1枚の見込み損益は手数料を含まずに+2452円です。


---------------------------
OK
---------------------------
夕場に変な参戦の仕方をしたので訂正。
夕場が、調子に乗って下げすぎだろう、という感じだったのだが、これ、引けにかけて今日の日経平均の終値付近まで戻す展開になれば売り建てして持ち越しするのも面白そうだな、と思い8880で指値しておいた。引けにかけて戻す展開を想定していたのでずっと場を見ていなかったのだが、ふと見たらとっくに約定している!で、オーバーシュートせずにドンピシャで8900で切り替えしていた。こえー。

さて、明日は下げるなら25MAに向けてどかんと下げる。上げるなら今日の終値付近からという展開になるというてっきとーな読みでこういう事をしたわけですが、目はどう出るでしょうか。

Lv1.00(整数部がmini発注枚数の半分の切り上げ値)
---------------------------

---------------------------
トータル損益は+5040円です。

このうち手数料の支払いが960円含まれます。

買い注文回数は10回, 売り注文回数は10回です。

未返済の建て玉0枚の見込み損益は手数料を含まずに±0円です。


---------------------------
OK
---------------------------

午前はともかく午後は一方的に下げるだけで値幅も大きかったのにこの程度の利益とは・・・がっくし。動きがなくなって余りの眠さに頭をはっきりさせようとスキップリストのライブラリに手をつけていたら一気に8900まで下げちゃうんだもんなあ。その後は逃がした魚は大きいという奴で欲が出て底値付近でショートして損きりになったり逆にリバウンドを狙ってロングしてやっぱり損きりになったりを繰り返してしまった。しかし引けにかけては一段の下げがあってどうにか体裁を保てたという所。まあ二日連勝は素直に喜ぼう。

以下午前中の愚痴

前場は、日経平均だけ見ると反落の後半値戻しという分かり易い展開なんだけど、先物は、完膚なきまでにランダムウォークなんだよなあ。やりにくい。夕場で先行して下げたというのもあるんだろうけれど。ちなみに、時間の平方根を取る表示なのでランダムウォークが種々の長さの直線運動の連なりとして視覚的に分かり易くなるのだ。

9005S-8975Cで3000円利益が出せたけど、その後小幅のリバウンドを待ってさらにショートしたら大きい戻しに捕まってしまった。損きりと言えないくらいの大きな損を出して手仕舞いした後改めて9040S。現在その含み損益は入れずに-5000円くらい。後場の終値が9000円を割らないという事はないと思うけれど、もうそうそう-3%とかの下げにもならないだろうから、どこかでうまくロングポジションを取らないと、この損を取り返すだけで終わってしまいそう。

スキップリストの.net実装を更新

スキップリストの.net上の実装を少し更新した。いつもと同様ファイル置き場に置いてある。とは言っても、ヘルプに記載しているサンプルコードに手を入れたのと、パブリックなメソッドの引数名を先頭大文字にした事だけ。この辺の標準的な名前付け規約はまだ良く分かっていないので時々変えるかも。

今回のサンプルコードの変更では、以前は

totalVolume[depth] = SkipList<MyItem, MyNode>
.GetEnumerableInOrder(start, true, end, true, depth - 1)
.Sum((n) => n.totalVolume[depth - 1]);
vwap[depth] = SkipList<MyItem, MyNode>
.GetEnumerableInOrder(start, true, end, true, depth - 1)
.Aggregate<MyNode, VolumeVwapPair>(new VolumeVwapPair() {
Volume = 0,
Vwap = 0
}, (pair, node) =>
VolumeVwapPair.Composite(pair, new VolumeVwapPair() {
Volume = node.TotalVolume[depth - 1],
Vwap = node.Vwap[depth - 1]
})).Vwap;

とごちゃごちゃしていた所を、

VolumeVwapPair ret = SkipList<MyItem, MyNode>
.GetEnumerableInOrder(start, true, end, true, depth - 1)
.Select((node) => new VolumeVwapPair
(node.TotalVolume[depth - 1], node.Vwap[depth - 1]))
.Aggregate(VolumeVwapPair.Composite);
totalVolume[depth] = ret.Volume;
vwap[depth] = ret.Vwap;

とすっきりした記述にした、等等、匿名メソッドを闇雲に使う代わりにSystem.LinqのSelect拡張メソッドを一段階挟んで、VolumeVwapPair.Compositeメソッドが可換半群の合成規則を与えている事が明瞭になるようにした。この変更は「身も蓋もない」のコードにも反映してある。もちろん以前のコードと等価な範囲の変更である。

サンプルコードの全体は以下のようになっている。可換半群の任意の区間に渡る総和計算をスキップリストのツリー状の構造を用いて高速に行う事が実際に簡単に実装できるようになっているのが分かると思う。

使用例

時刻、値、出来高を持つ株価の歩み値データを考えます。このデータを時刻によりソートし、任意の区間に対して出来高の総和と出来高を重みとした加重平均値(VWAP値)を高速に計算できるようにしたい場合には次のようにします。なお、以下のコードではEnumerableで定義される拡張メソッドが用いられているためコードの先頭でusing System.Linq;が記述されている必要があります。

まずMyItemクラスを次のように定義します。

C#
class MyItem
{
private DateTime time;
private double price;
private double volume;
public MyItem(DateTime time, double price, double volume)
{
this.time = time;
this.price = price;
this.volume = volume;
}
public DateTime Time { get { return time; } }
public double Price { get { return price; } }
public double Volume { get { return volume; } }
}

次に(重み,平均値)ペアがなす可換半群を表すVolumeVwapPairクラスを定義します。なお、重みが0である全てのペアは同一視されこの可換半群の単位元としての役割を果たします。

C#
class VolumeVwapPair
{
public double Volume;
public double Vwap;
public VolumeVwapPair(double Volume, double Vwap)
{
this.Volume = Volume;
this.Vwap = Vwap;
}
public static VolumeVwapPair Composite(VolumeVwapPair pair1,
VolumeVwapPair pair2)
{
double totalVolume = pair1.Volume + pair2.Volume;
if (totalVolume == 0) return new VolumeVwapPair(0, 0);
return new VolumeVwapPair(totalVolume,
(pair1.Volume * pair1.Vwap + pair2.Volume * pair2.Vwap)
/ totalVolume);
}
}
そしてMyNodeクラスを次のように定義します。
C#
class MyNode : SkipListNode<MyItem, MyNode>
{
private double[] totalVolume;
private double[] vwap;
protected override void OnHeightDecided()
{
base.OnHeightDecided();
InitializeParameters(ref totalVolume);
InitializeParameters(ref vwap);
}
protected override void OnMaintainance(int depth)
{
base.OnMaintainance(depth);
if (IsHeader || IsFooter) return;
if (depth == 0) {
totalVolume[0] = Item.Volume;
vwap[0] = Item.Price;
} else {
MyNode start = this;
MyNode end = this.Next[depth].Prev[depth - 1];
VolumeVwapPair ret = SkipList<MyItem, MyNode>
.GetEnumerableInOrder(start, true, end, true, depth - 1)
.Select((node) => new VolumeVwapPair
(node.TotalVolume[depth - 1], node.Vwap[depth - 1]))
.Aggregate(VolumeVwapPair.Composite);
totalVolume[depth] = ret.Volume;
vwap[depth] = ret.Vwap;
}
}
protected override int Compare(MyItem item1, MyItem item2)
{
return item1.Time.CompareTo(item2.Time);
}
public double[] TotalVolume { get { return totalVolume; } }
public double[] Vwap { get { return vwap; } }
}

最後にMySequenceクラスを次のように定義します。

C#
class MySequence : SkipList<MyItem, MyNode>
{
public double TotalVolume(MyNode former, MyNode latter)
{
return Sum(former, latter, (node, depth) => (node.TotalVolume[depth]));
}
public double Vwap(MyNode former, MyNode latter)
{
return Aggregate(former, latter,
VolumeVwapPair.Composite,
(node, depth) => new VolumeVwapPair
(node.TotalVolume[depth], node.Vwap[depth]),
new VolumeVwapPair(0, 0)).Vwap;
}
}

この例では重みの総和に関してはDouble型の総和を計算するSum(TNode, TNode, Func<TNode, Int32, Double>)メソッドを用いて計算し、全平均値に関しては通常の意味での加法によって合成されない可換半群の典型例である(重み,平均値)ペア(重みは通常の和で、平均値は加重平均によって合成される)に対して一般的な可換半群の総和を計算するAggregate<T>(TNode, TNode, Func<T, T, T>, Func<TNode, Int32, T>, T)メソッドを適用する事で計算しています。

ほとんどの場合、可換半群は通常の意味での加法群と等価である事に注意してください。実際、(重み,平均値)ペアと(重み,重み*平均値)ペアとは重みが0である場合を除いて一対一に対応します。そして重み及び重み*平均値はそれぞれ独立に通常の意味での加法によって合成されます。従ってMyNodeクラスのOnMaintainanceメソッド及びMySequenceクラスのVwapメソッドはそれぞれ

C#
protected override void OnMaintainance(int depth)
{
base.OnMaintainance(depth);
if (IsHeader || IsFooter) return;
if (depth == 0) {
totalVolume[0] = Item.Volume;
vwap[0] = Item.Price;
} else {
MyNode start = this;
MyNode end = this.Next[depth].Prev[depth - 1];
totalVolume[depth] = SkipList<MyItem, MyNode>
.GetEnumerableInOrder(start, true, end, true, depth - 1)
.Select((node) => node.TotalVolume[depth - 1])
.Sum();
vwap[depth] = SkipList<MyItem, MyNode>
.GetEnumerableInOrder(start, true, end, true, depth - 1)
.Select((node) => node.Vwap[depth - 1]
      * node.TotalVolume[depth - 1])
.Sum() / totalVolume[depth];
}
}
及び
C#
public double Vwap(MyNode former, MyNode latter)
{
double totalVolume = TotalVolume(former, latter);
if (totalVolume == 0) return 0;
return Sum(former, latter,
(node, depth) => node.Vwap[depth] * node.TotalVolume[depth])
       / totalVolume;
}
と書く事もできます。

2009年1月7日水曜日

体調

今日は睡眠の質は低くはなかったと思うのだが、まるで一睡もしていないかのように強烈に眠い。眼の奥と額が強烈にツーンとしている。体中がだるい。肩~腕の筋肉痛もすごい。咳・痰が少しだけだけど激しくなってきたのと、起きた時に風邪気味な感じ。でも、動いているうちにそれは大した事はなくなる。それと、朝から日中にかけて凄く低体温。お茶を何杯も飲んでも体が温まらない。

体を動かさないのも却ってストレスになって、時々腕立て伏せなんかしたりするのだが、一日やったら二日空けるペースでも肩の筋肉痛とだるさが全くとれない。まるでわざわざ自分を痛めつけているかのよう。

スキップリストのライブラリもバージョンアップ

アドイン製作の副産物のスキップリストを.net Framework上で実装したライブラリもバージョンアップした。今まで継承先で実装していたメソッドのうち汎用性のあるものをライブラリに移した。具体的にはSkipListNodeクラスのInitializeParametersメソッドとSkipListクラスのSum, Aggregateメソッドとか。

これで可換半群の区間に渡っての総和計算がかなり実装し易くなったはず。

ダウンロードはここから

「身も蓋もない」バージョンアップ

「身も蓋もない」は、実用上の違いはありませんが内部的な処理をいくつかより好ましいものに変えました。できるだけアップデートしてください。

具体的には寄り付き前にログインした場合に受信されるデータの時刻・日付がおかしい問題への対処を変更しました。これに伴い「現時刻より大幅に未来の/過去の~」というメッセージが表示される事がありますが、ザラ場外に表示される限りは気にしなくて問題ありません。

「身も蓋もない」のダウンロードは詳細サイトのファイル置き場から。

今日の戦績

9295Sの売り建て玉はふてねする前に返済買いを9155,指成の指定にしておいたんだけど、指成って大引けじゃなくて前場引けでも有効なのを失念していた。9290で返済でまた薄利。ていうか、後場に下げる事を見越しての指値だったんだが、良く前場引けまでに利益が乗る所まで下がったな。ふてねから目覚めて相場を見たら9260まで下げているんだから悲しくなるけどこれは自分のミスで損にならなかっただけラッキーと思うべき。ネットワークはやはりまだ不調みたいだし、自分の操作ミスも出てしまったし今日はこれで止めておく。いろいろ縁起が悪すぎる。

現在Lv1.00(整数部分がmini発注可能枚数の半分の切り上げ値)
---------------------------

---------------------------
トータル損益は+4876円です。

このうち手数料の支払いが624円含まれます。

買い注文回数は7回, 売り注文回数は6回です。

未返済の建て玉0枚の見込み損益は手数料を含まずに±0円です。


---------------------------
OK
---------------------------

今日の
  • 最近にしては大きめの値幅
  • 強い方向感を持った動き
  • 行って来いの展開
という状況でこの程度の利益って泣きたくなる。最近損を繰り返しているだけに絶好のチャンスをここまで見事に逃すとは呆れ果てるしかない。精進しよう。

以下午前中に書いた愚痴:

何じゃ今日は。

まず9170Sの持ち越しはほとんど意味がなかったけど、寄付き後に下げて+30ほどになった。そこで利確のため返済買いをしたら、散々遅延したあげくに9165で約定しやがった。

これがけちのつき始めで、ひたすらにネットワークが不安定。

前場の9300までとても強い動きで上げていく場面でも、参戦した後長い間相場データが受信できなくなり仕方なく薄利で手仕舞いせざるを得なくなった。その後一度ログアウトしてログインして様子を見てみたら、ログアウトにもログインにも凄く時間がかかった上に既に9300。ひでえ。スルスルと上がっていくだけの場面でロングポジションを取れないなんてそんなんじゃトレードになりゃしねえ。

すごく損した気になって、合理的でないと理解しつつも堪えきれずに、そこで9295S。さすがにトレンドが転換したわけでもないので、小さく押す場面を捕まえれば良いや、と思っていたのだが、ここでまた接続が途切れて相場データが受信できず。再開したらもう9330までいっている。そしてまたデータを受信できなくなる。暗闇の中でやっているようなもの。もう今日は後場に上げ幅を消していく展開と決め付けて、後場に手仕舞う事にしてふてね。まあ例によって強烈な眠さを我慢してのトレードだし。

こういうツールやネットワークの調子が悪いというのもリスクの一つと考えてトレードを控えるべきで、昨日反省した、いつもの参戦すべき理由がない状況で我慢できずに無理やり参戦する癖がこういう形でまた出てしまったという面は確かにある。でも、散々方向感のない動きに損を出させられて苛立たせられ続け、やっと巡ってきた強い方向感のある日にこれじゃあ一体どうやって利益を出せというのか。むがー。