エクセルでのバックテスト

エクセルでのバックテストについて記載しようと思っていたのですが、以下の記事がわかりやすいので、あんまり書くことがなかったです。

むかし確認したUKIさんの元祖ドテン君の検証を改めて整理してみようと思います。元ネタはこれです。

下図が今、足データを取ってきてエクセルで確認した成績です。

bitFlyerの足データを使った結果です。

3月末くらいに手法が公開されたと記憶していますが(上ブログ記事の日付は4/7)、そのあたりを境に成績が悪くなっているのが確認できます。

即エントリーというのは、ブレークした値段で理想的にエントリーできたと仮定した場合の成績で、終値エントリーというのは、ブレークが起きた足の終値(次の足の始値)でエントリーした場合の成績になります。

UKIさんもツイッターで言及していましたが、(手法公開前までは)、次の足の始値まで待ってエントリーしても成績が変わらないという点が特徴的です。2時間足を使った手法だったので、かなり余裕をもってエントリーできたことになります。

この特徴は、直近高値のブレークのように、チャートをパッと見れば誰でもわかるようなエントリーポイントではなく、ATR(っぽい数値)を使ってブレーク判定をしていて、誰でもすぐに目視でエントリー位置がわかるわけではない。というところがポイントだったようです。

手法公開後は席取り合戦が始まっているようで、すぐにエントリーできないと負けてしまう結果になっています(この時期から大きなトレンドが出にくくなったのもあると思います)。今でもすぐにエントリーできればちょい勝ちできる点がおもしろいですね。しかし、3月末までの成績はすさまじい。

続いてBitMEXで同じ手法を使った場合の成績を見てみたいと思います。

同じ期間の成績ですが、えらく汚いグラフという印象を受けます。成績もbitFlyerより悪いです。なぜこういった違いがでるのか?というのは、正直よくわからないのですが、取引所が違えば参加者が異なる点や(動きやすい時間軸や値幅が違ってくる)、BitMEXは成行手数料が高いので、成行手数料無料のbitFlyerとは値動きが違う点などが影響しているのだと思われます。(他にも取引所としての違いは数多くある。同じエクセルに足データを貼り替えただけだが、ひょっとして何かミスってる?)

手法公開後すぐに顕著に勝てなくなっている点が面白いです(bitFlyerなら公開後もしばらく勝てている)

それではこの辺で終了します。次回はスロットの話でもしようかと思います。

今回使った足データを取ってくるコードは有料版の方に乗せたいと思います。(有料にするほどの内容ではないのですが、単純にレベルが低くて恥ずかしいのと、ひょっとしたら誰かが応援のために買ってくれるかもという淡い期待で。。。エクセルも載せようと思ったのですが添付できないんですね。)

→(2018/9/4追記)やはり明らかに有料にするような内容では無いので無料にしました。(幸いまだ購入者はいないので今のうちに。。。)



---------------------------------------------------------------------------------
import requests
from datetime import datetime
import pandas as pd
from pprint import pprint

chart_sec  = 7200 # 2時間足を取得する

# CryptowatchのAPIを使用する関数--------------------------
def get_price(min, before=0, after=0):
	price = []
	params = {"periods" : min }
	if before != 0:
		params["before"] = before
	if after != 0:
		params["after"] = after

	response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",params) 
    #bitmex: https://api.cryptowat.ch/markets/bitmex/btcusd-perpetual-futures/ohlc
    #bitflyer: https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc
	data = response.json()
	
	if data["result"][str(min)] is not None:
		for i in data["result"][str(min)]:
			if i[1] != 0 and i[2] != 0 and i[3] != 0 and i[4] != 0:
				price.append({ "close_time" : i[0],
					"close_time_dt" : datetime.fromtimestamp(i[0]).strftime('%Y/%m/%d %H:%M'),
					"open_price" : i[1],
					"high_price" : i[2],
					"low_price" : i[3],
					"close_price": i[4] })
		return price
		
	else:
		print("データが存在しません")
		return None
# ------------------------------------------------------
        
# メイン
price = get_price(chart_sec,after=1514732400) #1451606400(2016/1/1) 1514732400(2018/1/1)  1519830000(2018/3/1) 1522508400(2018/4/1) 
pprint(str(len(price)))

param_close_time = []
param_close_time_dt = []
param_open_price = []
param_high_price = []
param_low_price = []
param_close_price = []

# 価格を配列に格納する
for i in range(len(price)):
    param_close_time.append( price[i]['close_time'] )
    param_close_time_dt.append( price[i]['close_time_dt'] )
    param_open_price.append( price[i]['open_price'] )
    param_high_price.append( price[i]['high_price'] )
    param_low_price.append( price[i]['low_price'] )
    param_close_price.append( price[i]['close_price'] )

# Pandasで1つの表にする
df = pd.DataFrame({
	"close_time"       :  param_close_time,
	"close_time_dt"    :  param_close_time_dt,
	"open_price"       :  param_open_price,
	"high_price"       :  param_high_price,
	"low_price"        :  param_low_price,
	"close_price"      :  param_close_price
})

# 列の順番を固定する
df = df[[ "close_time","close_time_dt","open_price","high_price","low_price","close_price"]]

# 最終結果をcsvファイルに出力
df.to_csv("result-{}.csv".format(datetime.now().strftime("%Y-%m-%d-%H-%M")) )

この記事が気に入ったらサポートをしてみませんか?