こんにちは!スナフキンです.今日はシステムトレードにおける資金管理法について書いていこうと思います.前から作っていたテクニカル系botの開発がひと段落し,眺めているだけになって(もちろん改良点はあるのですが)ある程度時間ができたので,bot開発に必要な処理・部品について解説記事を書こうと思い立った次第です.本業もあるため,定期的な更新は難しいと思いますが,シリーズとして不定期にローソク足データの処理,バックテスト,複数の時間軸に対応したテスト方法,ロジックの作り方などについて書けたらと考えています.その第一弾として今日は資金管理とそのpythonへの実装方法について解説します.
モチベーションと必要性
さて,そもそも資金管理とは自身の資金量に合わせてロットや取れるリスクを調節する全ての行為を指し,その言葉の指す意味が極めて広範なため,今回は「ビットコインの証拠金取引において,証拠金の額に応じてロットをどう調整するか」という話題に絞って解説していきます.
現物と違ってロスカットという概念がある証拠金取引において,この資金管理は非常に重要です.(もちろん現物でも重要ですが.)証拠金維持率をどの程度に設定するのかというのはトレード手法によって異なり,一般的にはスキャルピングのような超短期トレードでは低めでもOK.スイングトレードのような比較的長期のトレードでは,高い証拠金維持率が望ましいと言われます.
資金管理法は,上記のようなロスカットで資金のほとんどを全てを失わないための,いわば「防御力」を高めるための他に,利益を複利で増やすために「攻撃力」を高めるためにも重要です.
さて,ここで以下の2パターンの資金管理法について,簡単なシミュレーションを行ってみます.
- 特にロット管理を行わず,資金が増えてもロットを変えないでトレードを行う.
- 資金が2倍になるごとに,ロットを2倍にしてトレードを行う.
いずれも日利100%と仮定し(少しありえない数字ですが,それはあまり本質的なことではないのであまり気にしなくてOK.),0.01枚からスタートで,初期資金10000円(すなわちレバ15倍で1BTC100万円なら証拠金維持率1000%以上.)として,n日目のの終わりに資金がいくらになっているかを計算すると以下の表のようになります.
a. ロットを固定で行う場合
日数(日) | 1 | 2 | 3 | 4 | 5 | … | n |
ロット(枚) | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | |
資金(JPY) | 10000 | 20000 | 30000 | 40000 | 50000 | 10000×n |
b. ロットを資金に応じて変える場合
日数(日) | 1 | 2 | 3 | 4 | 5 | … | n |
ロット(枚) | 0.01 | 0.02 | 0.04 | 0.08 | 0.16 | 0.01×2^(n-1) | |
資金(JPY) | 10000 | 20000 | 40000 | 80000 | 160000 | 10000×2^(n-1) |
※^記号は累乗の意味.
JPY資金を見ると資金管理を行う場合と行わない場合で,パフォーマンスが圧倒的に違うことが分かると思います.これは,指数関数と直線の違いに起因しています.

図:指数関数(オレンジ)の方が圧倒的に増加スピードが早い.
日常会話でも,圧倒的な速度で伸びることを「指数関数的に増加する」などと言いますが,これはまさに言い得て妙です.ちなみに,指数関数的な増加を英語で「exponential growth」と言いますが,これは日本人にも有名な英国人シンガーのEd sheeranの曲「What do I know」にも出てくるような一般的に使われる表現ですので,覚えておくと英会話で役立つかもしれません.笑
まあぼくはプロのトレーダーでもなく,資金管理の重要性などと偉そうに語るほどの者でもないので,前振りはこのぐらいにしておいて,具体的にどのように資金管理法を数式で表現していくかを考えていきます.
簡単な数式での表現
さて,本記事の目的は資金管理法をbotに実装することですが,それを行う前段階として資金管理法を数式で表現する必要があります.なぜならコンピュータで行うシステムトレードでは,トレードロジックから資金管理法まですべてを具体的な条件に落とし込まなければコーディングできないためです.(人間の場合はそれを無意識にやっている人もいて,そのような無意識に身に着けている知識を「経験」と呼んだりします.)
ということでこれから次の条件を数式にします.
・証拠金1万円ごとにロットを0.01枚増やす.(証拠金維持率1000%<)
・0.015枚などの小数第三位までの枚数にはしない.
言葉だけだと分かりづらいので条件をグラフにしたものを以下に示します.

図:10000円ごとにロットを0.01枚増やす.
このグラフを見て見覚えがあると思った方もいるかもしれません.これはまさに,中学高校の数学で習う「ガウス記号」の関数だからです.ガウス記号というのは,日本では[]と表記され,(海外では別の記号を用います.)[x]はxの整数部分を指します.(ex. \([1.2]=1\))本グラフは\(xを証拠金・yをロットとして,y=10^{-2}[10^{-4}x]\)で,これが条件の数学的な記述になります.本当はロットを資金の量に従って線形に増やすだけであれば,\(y=10^{-6}x\)でも良いはずなのですが,このように数値を「丸め」なければならない理由は,トレードでこのようにロットを実数値で連続的に変化させてしまうと,0.012353212枚のような枚数でトレードを行うことになり,ポジション管理などが非常に面倒になるためです.
ガウス記号は,このように数値の「丸め」を行うよという記号に過ぎないのですが,中学高校では苦戦している人も周囲に多くいたので,学校の先生はもう少し教え方を考えてもいいかもしれません.
コードでの実装
さて,ここまで来ればコードに実装するのは非常に簡単なのでこれを実装します.作りたいのは,証拠金金額を代入するとロットを返してくれる関数で,以下のようになります.
1 2 3 4 5 6 7 8 9 |
import math #ロットの計算を行う関数 def calculateLot(margin): lot = math.floor(margin*10**(-4))*10**(-2) return round(lot,2) #テスト lot = calculateLot(10000) print(lot) #結果:0.01 |
pythonでは,小数点以下で桁指定をして切り捨てを行ってくれる関数がないので,一度10000円単位で整数にしてから,小数に直しています.切り捨てを行う桁を変えれば,ロットを5000円ごとに増やすようにもできます.
文章が長かった割にかなり淡白なコードでした.笑
ロットの決め方はこれだけでも本が書けてしまうほど非常に奥が深いものなので,より深く知りたい方は以下の本を参考にしてみてください.
ここまでお読みいただきありがとうございました!