【Python】【トラリピ】必要資金をPythonで算出してみる

Python

Pythonを使って、トラリピで必要になる資金を算出してみました^_^

単一通貨ペア、複数通貨ペアに対応しています。

算出はトラリピの試算表使えばいいし、エクセルでも出せますが、Pythonの勉強の一環として作ってみました。

作る中でトラリピの理解も深まったので良かったと思います^_^

下手書きしてるので、効率の良いプログラムではないですが、私のような初心者の方には理解しやすいと思います笑

結果はトラリピ試算表と見比べて”だいたい”正しい(※a)ことは確認していますが、責任は持てないので、正しいかどうかはちゃんとご自身でチェックして下さいね^_^

※a : トラリピ試算表とちょっとズレます。試算表の方がより多くの資金が必要な結果になることがあります(←重要)。実際、ギリギリな資産では運用しないと思うので、あくまで目安として使うのがよろしいと思います。

環境

  • Python 3.7

プログラム

import numpy as np
import pandas as pd
import pandas_datareader.data as pdr
import datetime as dt

# 最新のレートを取得する
end = dt.date.today() # 本日まで
start = end - dt.timedelta(days=30) # 最新のデータが本日付けであるとは限らないので、とりあえず30日前までのデータを取り、その中で最新データを引用する
tickerlist = ['DEXJPUS','DEXUSAL','DEXUSNZ','DEXCAUS'] # 取得するtickerのlist
# tickerlist = ['DEXJPUS'] # 取得するtickerのlist
# DEXJPUS : JPY/USD
# DEXUSAL : USD/AUD
# DEXUSNZ : USD/NZD
# DEXCAUS : CAD/USD

# DataReaderからレートを取得
df0 = pdr.DataReader(tickerlist,'fred',start,end) # 日次データ
df0['JPYAUD'] = df0['DEXJPUS'] * df0['DEXUSAL'] # JPY/AUD算出
df0['JPYCAD'] = df0['DEXJPUS'] * (1 / df0['DEXCAUS']) # JPY/CAD算出

print(df0)

# 最終行のデータ(つまり最新)を取得
JPYUSD = df0.iloc[-1]['DEXJPUS']
print('Currency JPY/USD : '+str(JPYUSD))

# トラリピ範囲設定
pare = ['JPY/AUD','JPY/AUD','JPY/CAD','JPY/CAD','USD/NZD','USD/NZD','USD/NZD','USD/NZD','USD/AUD','USD/AUD','USD/AUD','USD/AUD'] # 通貨:JPY/AUD,JPY/CAD,•••
start = [70.2,85.4,70.2,95.8,0.644,0.6,0.64,0.704,0.508,0.808,0.514,0.814] # 下限
end = [85,100.2,95,119.8,0.7,0.636,0.644,0.76,0.796,1.096,0.79,1.09] # 上限
# step = [0.4,0.4,0.8,0.8,0.004,0.004,0.004,0.004] # 値幅
pcs = [38,38,32,31,15,10,2,15,25,25,24,24] # 本数
unit = 1000
losscutrate = [65,100.2,70,120,0.5,0.5,0.5,0.9,0.5,1.1,0.5,1.1]

# 空の配列を用意
spanstep = np.empty(len(pare))
suma = np.empty(len(pare))
sumb = np.empty(len(pare))
sumc = np.empty(len(pare))
sumd = np.empty(len(pare))
sume = np.empty(len(pare))
urikai = []

for i in range(len(pare)):
    span = np.linspace(start[i],end[i],pcs[i])
    spanstep[i] = span[1] - span[0] # 値幅
    
    suma[i] = np.sum(span * unit * 0.04) # 必要証拠金
    sumb[i] = np.sum((span - start[i]) * unit) # 含み損(下限時)
    sumc[i] = np.sum((abs(span - losscutrate[i])) * unit) # 含み損(ロスカットレート時)
    sumd[i] = suma[i] + sumb[i] # 必要資金(下限時)
    sume[i] = suma[i] + sumc[i] # 必要資金(ロスカットレート時)
    if( losscutrate[i] <= min(span) ): # 売り買いどっち?
            urikai.append('買')
    else:
            urikai.append('売')
    
    if 3 < i <= 11: # クロス円ではないペアを日本円に換算
        sumd[i] = sumd[i] * JPYUSD
        sume[i] = sume[i] * JPYUSD


df = pd.DataFrame({
	'通貨':pare,
	'売買':urikai,
	'start':start,
	'end':end,
	'step':spanstep,
    'pcs':pcs,
	'losscutrate':losscutrate,
	# 'A必要証拠金':suma,
	# 'B含み損(下限時)':sumb,
	# 'C含み損(ロスカットレート時)':sumc,
	'D必要資金(下限時=A+B)':sumd,
	'E必要資金(ロスカットレート時=A+C)':sume
	})
df = df.round(3) # 桁丸め

groupedcolumns = ['pcs','D必要資金(下限時=A+B)','E必要資金(ロスカットレート時=A+C)']
grouped2columns = ['D必要資金(下限時=A+B)','E必要資金(ロスカットレート時=A+C)']

grouped = df.groupby(['通貨','売買']).sum() # 通貨、売買のそれぞれの合計値

grouped2 = grouped.groupby('通貨').max() # 通貨ごとに最大値を出す(half&half用) それぞれの列のmaxなので行は合っていない。なので注意
sumval = grouped2.sum() # 各列の合計値
sumval.name = "Sum" # 行名
grouped2 = grouped2.append(sumval) # 最終行に合計値を追加

# csv出力
df.to_csv('df-tora.csv') # csv出力
grouped.to_csv('grouped.csv',columns=groupedcolumns)
grouped2.to_csv('grouped2.csv',columns=grouped2columns)

証拠金率は0.04で計算しています(レバレッジmax25倍)

必要資金はトラップすべてのポジションを持った想定での金額です。

通貨単位は0.1万通貨です。

ハーフアンドハーフで運用を想定しているため、通貨は売り買いの両方を設定する必要があります。(ハーフアンドハーフの詳細はトラリピ公式を参照下さい。売り買いで多い方の必要資金が有効になります)

最新のレートはpandas-datareaderを使ってFREDより取得しています。

FREDの更新が10日くらいズレるっぽいので最新とは言えないかもしれませんが、トラリピは長期投資なので問題にはならないかと考えています。

トラップ範囲は配列に突っ込んでいます。項目が多いとわかりづらくなるのが難点です。

トラップ値幅(step)を指定するのではなく、トラップ上限と下限を決め、本数(pcs)を指定するようにしています。(np.linspaceを使用)

np.arangeならstep数が指定できますが、NZDUSDなどの少数が含まれる通貨だとうまく表示できない場合があるためnp.linspaceを使っています。(浮動小数点演算の誤差のため)

こちらのサイトさんが分かりやすく掲載して下さっています^_^

Python♪小数の繰り返し処理の落とし穴。range()、arange()、linspace()
for文で多用されるPythonの組み込み関数range()では小数が扱えません。しかし、私はこの仕様は気に入っています。なぜなら、小数の使用は動作が不安定になる可能性があるからです。実はNumPyのarange()やlinspace()で

結果をpandas.DataFrameに入れ、通貨ごとにグループ分けしたりして、csvに出力しています。

実行結果

csvデータは3種類出力しています。はじめのdf-tora.csvは全体の一覧です。

grouped.csvは同じ通貨ごとの売り買いのデータをまとめたもので、売り買いでどちらが資金が多く必要か分かります(ハーフアンドハーフ用)。同じ通貨ペアでも時差で追加したものもあるかもしれないので、通貨ごとにまとめました。

最後のgrouped2.csvは各通貨ごとの必要資金をまとめています。各通貨ごと列中で一番大きな値を表示しています。つまり、limit時の必要資金は売りの方が多かったが、ロスカットレート時では買いの方が必要資金が多かったなんて事があります。(下のJPY/AUDがまさにそれ)

最終行sumは全体の合計値です。つまり全体の必要資金です。

トラリピ試算表でも確認

試しに、配列0番目に設定しているAUDJPYをトラリピ試算表に入力して結果を比較してみます。

  • 通貨 : AUDJPY
  • 売買 : 買
  • 下限 : 70.2
  • 上限 : 85
  • ロスカット : 65
  • 本数 : 38

grouped.csvの結果より、トラップlimit時での必要資金は399,152円、ロスカットレート時の必要資金は596,752円と出ています。だいたい60万ですね。試算表の運用予定金額に596,752円と入れて、ロスカットレートが65円となれば大体合ってそうだと言えます。

結果を見ると必要資金の合計は399,152円となっており、合っていますね。ロスカットレートも64.474円なのでだいたい合っていますね。

試算表は一通貨ずつしか計算できないので、まとめてリスク管理するにはこのプログラムは使えるかなと思います^_^

おしまい^_^

コメント

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