プログラミングでアイデアを具現化したい

あらゆるものを具現化するためにプログラミングを始めました。主にC#

並列プログラミング

通常のループ処理

namespace ParallelTest {
    class Program {
        static void Main(string[] args) {
            var sw = new System.Diagnostics.Stopwatch();
            var intList = Enumerable.Range(1, 10);

            sw.Start();
            foreach (var i in intList) {
                Console.WriteLine(i.ToString() + ":" + sw.Elapsed);
                System.Threading.Thread.Sleep(500);
            }
            sw.Stop();
            Console.WriteLine("終了:" + sw.Elapsed);
            Console.ReadKey();
        }
    }
}

完了には5秒程度かかる。
f:id:tos5511:20171109204238p:plain



並列処理する場合

namespace ParallelTest {
    class Program {
        static void Main(string[] args) {
            var sw = new System.Diagnostics.Stopwatch();
            var intList = Enumerable.Range(1, 10);

            sw.Start();
            Parallel.ForEach(intList, i => {
                Console.WriteLine(i.ToString() + ":" + sw.Elapsed);
                System.Threading.Thread.Sleep(500);
            });
            
            sw.Stop();
            Console.WriteLine("終了:" + sw.Elapsed);
            Console.ReadKey();
        }
    }
}

Parallelの特性上、コレクションへのアクセス順序は保証されないが、
一気に並列処理するため、トータルで1秒程度で完了する。・・やばくね?(笑)
f:id:tos5511:20171109205420p:plain

BitFlyerの現物とFXの差額について

BitFlyerのbitcoin価格に現物とFXで乖離があるのはたぶん皆さんご存知だと思います。
感覚では大体いつも1万円前後乖離しているんじゃないかなーと思ってました。
少しデータもたまって来たので簡単にクエリ書いて視覚化してみました。

SELECT convert(nvarchar,[TickTime],111) + ' ' + left(convert(nvarchar,[TickTime],108),2)日時
      ,avg(case when [Ccy] = 'BTC/JPY' then ([Ask]+[Bid])/2 else null end)'現物'
   ,avg(case when [Ccy] = 'FX_BTC/JPY' then ([Ask]+[Bid])/2 else null end)'FX'
   ,ABS(avg(case when [Ccy] = 'FX_BTC/JPY' then ([Ask]+[Bid])/2 else null end)
	 -(avg(case when [Ccy] = 'BTC/JPY' then ([Ask]+[Bid])/2 else null end)))'差額'
  FROM [VCTS].[dbo].[price]
  where [Broker] = 'BitFlyer'
  and [TickTime]>'2017-10-10 20:48:53.000'
  group by convert(nvarchar,[TickTime],111),left(convert(nvarchar,[TickTime],108),2)
  order by 日時

f:id:tos5511:20171027010257p:plain

貼り付けたグラフに日付が乗ってなくて恐縮ですが、
60万ブレイクの際に差額は3万円近くにもなっていたようだ。
グラフ後半ではまたおおよそ差額1万円前後を挟んだ乖離で推移しているみたい。
・・なるほどわからん(笑)


ちなみに、最近はビットコインのシステムを作ったりして、
安定的に小銭を稼いでいたりしていました。

しばらくやってみた感想ですが、マーケットそのものと
参入している各業者の提供APIのクオリティが成熟したFXと比較して
相当未熟であると感じました。

んで、今の仮想通貨トレードにはスイスショックを上回る
意図しないファットテールリスクが潜んでいると判断し、
ビットコインシステムは停止することにしました。

もちろん作成したビットコインシステムのパフォーマンスが
素晴らしければ継続も視野ですけど、本当に小銭なんですよねw
追証リスクも約款を確認する限り、zaif以外は発生する。
なので、念のためですけど運用ストップです。

ビットコイン(BTC/JPY)の時間帯別値幅を出してみた

tos5511.hatenablog.com
以前投稿した記事と似た内容です。
ビットコインには時間帯による癖があるのか調査してみました。


ちょっと手持ちのサンプルが少ないんで統計値とはまだ呼べないかもですが。

select TB_A.tradedate
      ,MAX(case when TB_A.時間='00' then TB_A.値幅 else 0 end)'00'
    ,MAX(case when TB_A.時間='01' then TB_A.値幅 else 0 end)'01'
    ,MAX(case when TB_A.時間='02' then TB_A.値幅 else 0 end)'02'
    ,MAX(case when TB_A.時間='03' then TB_A.値幅 else 0 end)'03'
    ,MAX(case when TB_A.時間='04' then TB_A.値幅 else 0 end)'04'
    ,MAX(case when TB_A.時間='05' then TB_A.値幅 else 0 end)'05'
      ,MAX(case when TB_A.時間='06' then TB_A.値幅 else 0 end)'06'
    ,MAX(case when TB_A.時間='07' then TB_A.値幅 else 0 end)'07'
    ,MAX(case when TB_A.時間='08' then TB_A.値幅 else 0 end)'08'
    ,MAX(case when TB_A.時間='09' then TB_A.値幅 else 0 end)'09'
    ,MAX(case when TB_A.時間='10' then TB_A.値幅 else 0 end)'10'
    ,MAX(case when TB_A.時間='11' then TB_A.値幅 else 0 end)'11'
    ,MAX(case when TB_A.時間='12' then TB_A.値幅 else 0 end)'12'
    ,MAX(case when TB_A.時間='13' then TB_A.値幅 else 0 end)'13'
    ,MAX(case when TB_A.時間='14' then TB_A.値幅 else 0 end)'14'
    ,MAX(case when TB_A.時間='15' then TB_A.値幅 else 0 end)'15'
    ,MAX(case when TB_A.時間='16' then TB_A.値幅 else 0 end)'16'
    ,MAX(case when TB_A.時間='17' then TB_A.値幅 else 0 end)'17'
    ,MAX(case when TB_A.時間='18' then TB_A.値幅 else 0 end)'18'
    ,MAX(case when TB_A.時間='19' then TB_A.値幅 else 0 end)'19'
    ,MAX(case when TB_A.時間='20' then TB_A.値幅 else 0 end)'20'
    ,MAX(case when TB_A.時間='21' then TB_A.値幅 else 0 end)'21'
    ,MAX(case when TB_A.時間='22' then TB_A.値幅 else 0 end)'22'
    ,MAX(case when TB_A.時間='23' then TB_A.値幅 else 0 end)'23'
from 
(
SELECT convert(nvarchar,[TickTime],112) tradedate
      ,left(convert(nvarchar,[TickTime],108),2) 時間
    ,MAX(([Ask]+[Bid])/2)-min(([Ask]+[Bid])/2) 値幅
  FROM [VCTS].[dbo].[price]
  where [TickTime]between 'from' and 'to'
  and [Broker]='broker'
  and [Ccy]='ccy'
  and [Ask]>0 and [Bid]>0
  group by convert(nvarchar,[TickTime],112),left(convert(nvarchar,[TickTime],108),2)
)TB_A
group by TB_A.tradedate

f:id:tos5511:20170930024733p:plain

9月20日から29日まで、9日間の集計です。
上段がBTC/JPY、下段がUSD/JPY。
ドル円の21日3時はFOMCあったので、エクセルの見栄え上、書式外しています。

うーん、よくわからん(笑)為替のように動きやすい時間や曜日があるのかも?
という仮説を検証してみたいがもう少しデータを溜めないとだめか、
そもそもそんな特徴はないのかw

f:id:tos5511:20170930030440p:plain
おまけでBitflyerの過去24時間のvolume推移。
月曜から水曜にかけて出来高が落ちていくのはもしかしてサラリーマンが疲れてしまっているせいか(笑)
なわけないか、単純にマーケット次第だろう。