1日は86,400秒のプレゼント。C#のBinaryReaderとDateTimeをPythonに変換

次のような銀行があると、考えてみましょう。

その銀行は、毎朝あなたの口座へ

 

86,400ドル

 

振り込んでくれます。

同時に、その口座の残高は毎日

 

ゼロ

 

になります。

 

あなただったらどうしますか?

 

毎日86,400ドルを全額を引き出す

 

ことでしょう。

私たちは、一人一人が同じような銀行を持っています。

 
 
 

時間です。

 
 
 

毎朝、あなたに

 

86,400秒

 

が与えられています。

 

毎晩、あなたがうまく使いきらなかった時間は消されてしまいます。

 
 

それは、翌日に繰り越されません。

 
 

だから、与えられた時間に最大限の投資をしましょう。

 
 

時計の針は、走り続けています。

 
 

1年の価値を理解するには、浪人した学生に聞いてみるといいでしょう。

1ヶ月の価値を理解するには、未熟児を産んだ母親に聞いてみるといいでしょう。

1週間の価値を理解するには、週刊誌の編集者に聞いてみるといいでしょう。

1時間の価値を理解するには、待ち合わせをしている恋人たちに聞いてみるといいでしょう。

1分の価値を理解するには、電車をちょうど乗り過ごした人に聞いてみるといいでしょう。

1秒の価値を理解するには、たった今、事故を避けることができた人に聞いてみるといいでしょう。

10分の1秒の価値を理解するためには、オリンピックで銀メダルに終わってしまったランナーに聞いてみるといいでしょう。

 
 

一瞬一瞬を大切にしましょう。

時は誰も待ってくれません。

 
 

昨日は、もう過ぎ去ってしまいました。

明日は、まだわからないのです。

今日は、今あなたに与えられれるものです。

 
 

だから、英語では

 
 

「今」をプレゼント(= present)

 
 

といいます。

[元ネタ一部改変]エレノア・ルーズベルト(アメリカ第32代大統領の妻)

現在、Protraの株価データをCSVに変換してPythonで読みこんで使っている。

このため自動売買を完成するには、この処理の自動化が必要だ。

 
 

バイナリファイルをそのまま読めば良いんじゃない?

 
 

車輪の再発明を行わないためにProtraを使っているのに、いつまでも車輪を作っている感がある……。

 
 

 
 

毎日86,400秒の無駄使いの40年……。

バイナリファイルをPythonで読む

「Protra.Lib/Data/PriceData.cs」を読めば書いてある。

いや……そうだけどさ。

C#なんて扱ったことないし読むの大変なのよ……。

該当部分を確認すると「ReadInt」などを使って読み込んでいた。

うーん、色々とググってバイナリを読み出してみたけど、日付部分が正しく取り出せん。

だったさC#のBinaryStreamをそのままPythonで実装すれば良いじゃん。

と思ってググると、ドンビシャなstackoverflowを発見!

ReadInt(), ReadByte(), ReadString(), etc. in Python?
The functions ReadInt(), ReadByte(), and ReadString() (to name a few) exist in other languages for reading input from streams. I am trying to read from a socket...

ここに書いてあるコードを使うと確かに取り出せた。

 
 

でも、やっぱり日付がオカシイ。

この「86,400」の数字は何なのさ!

 
 

これは冒頭の説明通り1日を意味する。

DateTimeの最小値である0001年1月1日 0時0分0秒からの経過時間を100ナノ秒単位で表していると思ってる。

しかし、それを踏まえてもPythonの計算結果が全然違う。

 

 

日付データの最古が

1998年01月05日(UNIX時間=883926000)

なので、その数値が「ゼロ」になるように計算してみると正しい日付が取得できた。

これは「-62135629200=883926000 – 729393 * 86400」(0001年01月03日 0時0分0秒)を表している。、

つまり、UNIX時間とC#のDateTimeの時間軸、UNIX時間(1970年01月01日~)と時間の開始時点をあわせる必要があったようだ。

株分割に対応する

Protraのバイナリデータは、株式分割・併合が考慮されていない。

株式分割は「index.txt」内にあるデータを用いている。

「Protra.Lib/Data/BrandData.cs」を読んでみた。

「index.txt」をCSV形式で読み込んで、必要な情報を抽出すれば良さそうだ。

これでデータは完全に一致した。

まとめ

日付計算の解釈が正しいのかは自信がない。

でも、とりあえず合ってそうだけどな……。

間違っていたら誰か教えて下さい。

ソースコード

Protraで事前に株価のダウンロードが必要。

タイトルとURLをコピーしました