※当サイト一部記事にはP Rが含まれます

ケリー基準(オプティマルf)による複利運用を自動売買botに導入(Pythonコード付き)。

TIPS
この記事は約14分で読めます。

自動売買ロット調整どうすれば?複利効果を最大化してビットコインFXで最速億り人を目指す方法を解説。

 

ビットコインFXなどで自動売買botを動かすことがブームになってますけど、botが安定稼働してくると「システムトレードする売買ロットをどうやって調整しよう?」「出来れば複利効果を狙って自動ロット調整機能を付けたい!」みたいなことを考えるようになるのではないかと思います。

 

「複利運用?複利効果?なんすかそれ?」という人に簡単に説明しておきます。例えば20万円の証拠金が口座に入っていて1BTCでトレードしていたとします。うまく運用が回って資金が40万円に増えました。じゃあ、売買する量も2BTCに増やそうかなって話です。

2倍→4倍→16倍→256倍→65536倍・・・。速攻で億り人じゃん!w(そんなにうまくいくわけがないw)

 

では、具体的にどうやってロットを増やしていけば良いのでしょうか?

その問いに答えてくれるのが今回紹介する「ケリー基準(オプティマルf)」です。

 

「ケリー基準(オプティマルf)」を活用することで、資金力(証拠金余力)と使っているストラテジーのリスク・性能から、最も効果的に資金を増やせるロット(資金の運用効率が最大化するロット)を感覚ではなく数式で算出することができます(もちろん注意点もあるので後述)。

まあ、簡単に言うと↓こんな感じですねwえ?違う?ww( *´艸`)

 

「ケリー基準(オプティマルf)」は比較的簡単に自動売買botに導入することができるのも利点です。私が作ったサンプルのPythonコードも記事に載せますので、見てみてくださいね~^^。

 

 

ケリー基準(オプティマルf)の理論の説明・概要。資金余力・最大損失額・最適f値(Optimal f)からトレードするロットを算出。

引用元:ケリー基準 http://www.geocities.jp/y_infty/management/criterion_3.html

 

ケリー基準(オプティマルf)の理論については、こちらのサイトの説明(サイトが消えてしまった模様です…)がとても分かりやすいです!。ページのスクショを引用させていただきました↑。

凄く丁寧に記載されているサイトですので、リンク先のページを読んでいただければ、ケリー基準(オプティマルf)の理論は理解していただけると思います。

 

私の記事ではビットコインFX自動売買で活用する場合の要点だけ整理します。

トレードロジックの期待値>0であることが大前提。

損益は、1BTC単位で売買した場合で算出。

そのロジックを使ったトレード結果(バックテストでも可)を、等確率(Pi)で発生するk通りのシナリオと仮定して、損益(Xi)を集計。

少なくとも1つ以上の損益(Xi)が負数。

最小の損益(Xi)の負け幅を、最大損失額Wとする。

0≦f≦1の範囲で、ケリー基準の式(上述の引用)のg(f)が最大になる最適f値(Optimal f)を算出。

[資金額]×[最適f値]×[fractional Kelly]÷[最大損失額W]で売買ロットが算出できる。

 

もっともっと詳しく知りたい人は書籍でチェックするのがオススメです。

投資家のためのマネーマネジメント ~資産を最大限に増やすオプティマルf

ラルフ・ビンスの資金管理大全

 

 

「ケリー基準(オプティマルf)」のPythonサンプルコード。資金余力の取得と損益の取引履歴のデータが必要。

では、さっそくPythonサンプルコードを紹介。私が書いたやつなんで間違ってても文句言わないでくださいw。

 

bitFlyerでBTCFXする前提のコードになりますので、他の取引所や他の金融商品の場合は書き換えてください。

また、計算には、そのトレードロジックで売買した過去の取引履歴のデータが必要です(無い場合はバックテストの損益を使います)。データは1BTCでトレードした場合の損益(-23532、+10222、+1233とかのbitFlyer BTCFXJPYの値幅でOKです)です。

私は全ての実取引データをbotが自動取得してMySQLのテーブルに書き込むようにしていますので、サンプルコードではMySQLのテーブルからSELECTしています。別にテキストファイルやログファイルから読み込んでもOKですし何でもOKですので、データ読み込み部分は適宜修正してください。

 

import json
import MySQLdb
import pybitflyer

fractional_kelly = 1 #安全係数
# 臆病者資産家向け推奨値:「0.3」
# 一般人向け推奨値:「0.5」ハーフケリー
# ギャンブラー向け推奨値:「0.8」
# カイジ向け推奨値:「1」 ざわ…ざわ…

# 最適f値(Optimal f)の算出
def calc_optimalf():
    # トレード履歴データ(MySQL)から損益値を取得
    con = MySQLdb.connect(
            user='XXXXXXXX',
            passwd='XXXXXXXX',
            host='XXXXXXXX',
            db='XXXXXXXX',
            charset='utf8',
            use_unicode=True)
    cur= con.cursor()
    sql = "SELECT id, soneki_r FROM t_bffx_trade_history WHERE type = 1 ORDER BY id DESC;"
    cur.execute(sql, )
    rows = cur.fetchall()
    cur.close
    con.close

    # 最大損失額Wの算出
    maximum_loss = 0
    for row in rows:
        if (int(row[1]) < maximum_loss):
            maximum_loss = int(row[1])
    calculated_w = 0 - maximum_loss

    # Optimalfの算出
    max_calculated_gf_multiplication = 0
    optimal_f = 0
    for i in range(1, 99, 1):
        f = i * 0.01
        calculated_gf_multiplication = 1
        for row in rows:
            calculated_gf_one = 1 + (f * (1 * int(row[1]) / calculated_w))
            calculated_gf_multiplication = calculated_gf_multiplication * calculated_gf_one
        if (max_calculated_gf_multiplication < calculated_gf_multiplication):
            max_calculated_gf_multiplication = calculated_gf_multiplication
            optimal_f = f

    # 戻り値
    return optimal_f, calculated_w

# Optimalfと資金余力からロット算出
def get_size_vol(api, optimal_f, calculated_w):
    collateral = int(api.getcollateral()['collateral'])
    size_vol = round(collateral * fractional_kelly / (calculated_w / optimal_f), 2)
    return collateral, size_vol

# メイン処理
if __name__ == '__main__':
    # bitflyerのAPI
    keys_json = open('config_bitFlyer.json', 'r')
    keys = json.load(keys_json)
    KEY = keys["key"]
    SECRET = keys["secret"]
    api = pybitflyer.API(api_key=KEY, api_secret=SECRET)

    # トレードするロットを計算
    optimal_f, calculated_w = calc_optimalf()
    collateral, size_vol = get_size_vol(api, optimal_f, calculated_w)

    # 結果を表示
    print('あなたのトレードロジックのOptimalfは' + str(optimal_f) + 'だよ。')
    print('そして、あなたの余力は' + str(collateral) + '円です。')
    print('だから、次のトレードでは' + str(size_vol) + 'BTCをトレードしようね♪')

 

設定値として「fractional_kelly(※安全係数です)」を指定できるようにしてます(詳細は後述)。

なお、サンプルコードでは結果を表示しているだけですので、実際にbotに実装する場合は、返ってきたsize_volの値をトレードで使うように修正くださいな。

 

 

「例え勝率が低くてもドローダウンがデカくても、損小利大のbotは優れている」は半分嘘。目的に応じてリスク管理・ロット管理まで視野に入れて考える。

さて、ここで突然ですが、なぞなぞです。あなたが複利効果を狙って手持ち資金を最大限活用する前提でbotを稼働するとします。以下の「システムA」と「システムB」のどちらを選びますか?

システムA

利益 848,776円
勝率 41.94%
最大損失 -126,798円
PF 2.311
期待値 13,689円

システムB

利益 467,419円
勝率 54.84%
最大損失 -53,413円
PF 1.502
期待値 7,539円

 

実はケリー基準を用いてリスクを考慮したロット管理をすると、「システムB」の方が資金が増えるスピードが速いという結果になります。

「システムB」は最大損失幅が「53413」、最適f値が「0.37」となり、証拠金10万円あたり0.69BTCのロットとなるので、1BTC/1トレードにおける期待値7,539円から、1回のトレードの収益見込みは5,201円となります。

一方、「システムA」は最大損失幅が「126798」、最適f値が「0.35」となり、証拠金10万円あたり0.28BTCのロットとなるので、1BTC/1トレードにおける期待値13,689円から、1回のトレードの収益見込みは3,832円となり、システムBの3/4程度にしかならないのです。

 

疑問に思うかもしれませんが、これって感覚的にも合致するんです。つまり…。

「最大損失が大きい/勝率が低いシステムは、1回のトレードで資金を失うリスクが大きい」

「リスクが大きいシステムなので、理論的に売買ロットを増やすことができない」

「資金の運用効率が落ちるので、性能が良くても稼げない」

ということです。

 

最近のビットコイン自動売買botのブームやドテン君の流行りで、「損小利大のbotは優れている」「期待値やPF(プロフィットファクター)が大事」みたいに考える人も増えましたが、単純にこれを盲信するのは危険だと思います

上述したbotのどちらが優れているかというのに決まった答えなどはありません。状況により異なると言えるでしょう。

 

お金持ち「資金効率なんてどうでもいい。潤沢な資金・少ないロット・余裕のレバで、とにかく単発で性能が良いbotで安全稼働したい」

という目的なら「システムA」のが向いているかもしれません。

 

カイジ「俺は種銭10万円しかない。多少リスクを負っても、手持ち資金を最大限活用して複利で大きく稼ぎたい」

という目的(という名の儚い夢)なら「システムB」のが向いているかもしれません。

 

重要なことは、「投資の目的・スタンスと許容リスクを明確にする」→「扱うロジック・ストラテジーの特徴・メリット・デメリットを正確に理解する」→「目的・リスクに見合ったロジックを選択する」ということだと思います

 

 

ケリー基準(オプティマルf)/複利運用を検討する際のコツと注意点。

投資・投機ではリスク管理は必須。取引履歴を記録してbotのリスクを客観的に把握しよう。

ケリー基準では実際のトレード結果を個々のシナリオに見立てて、最適f値を計算しています。このトレード結果は最初はデータもないですので、バックテストの結果で代用するしかないのですけど、運用を始めたら実運用のデータで算出することをオススメします。

トレードではスリッページが発生したり、逆指値が効かなかったり、理屈通りに約定できないことがありますので、実運用のデータでオプティマルfを計算することで理屈外のリスクも取り込むことが可能となります。

 

あと、データを元に自分が運用しているbotのリスクをちゃんと把握することが大事だと思います。

前項で上げた「システムA」は、実はデフォルトの「ドテン君」を私の環境でバックテストした結果(2018/01~04)です。ドテン君の最適ロットは「証拠金10万円=最大0.28BTC」ということです

ビットコイン自動売買bot「ドテン君」の特徴と評判。1.5倍稼げる改造版「ドテンたん」公開w
話題のBTCFX自動売買トレードbot「ドテンくん」買ってみた。本当に稼げるのか?本音レビューしちゃいます。 巷で評判になっているビットコイン自動売買bot「ドテン君」を5万円出して買ってみました! 「え?自適猫さん、頭でも打ったのかい?」...

 

それだけリスクが大きいbotということです。

今はドテン君が好調なので稼いだお金でロットを増やすことを考えている人もいるかもですが、要注意ですね。ドテン君は1撃で10万幅、20万幅負ける可能性もありますし、所謂「損益の非対称性」が発生しますので、取返しの付かないことになる可能性もあることを考慮しましょう。

 

ケリー基準のポイントは最大損失幅にある。ロスカットルールの設定や、レバレッジの強制決済で改善する。

ケリー基準の式を見るとわかるとおり、分母にある[最大損失額W]がポイントだということがわかるかと思います。

そのため、注文時に定率の逆指値STOPを入れるルールを入れておいたり、レバレッジの強制決済を活用することで、最大損失幅が小さくなり売買ロットを増やすことができます(これにより、botの性能が落ちるケースが多いかもしれませんが、仕方ありません)。

ロスカットルールが明確に定義されていないbotとかありえないかと思いますので、キッチリ処理するのが大事ですね。

 

fractional Kellyを設定。ハーフケリーにすることでリスクを抑える。

例えば5000回くらい実運用でトレードした損益データがあるとかなら、ある程度信頼できるかもしれません。

しかし、実際にはそんなにデータ数がないケースがほとんどです。しかも相場の状況は変化するので、最大損失額・勝率などがあてにならない場合も起こりえます。

そのため、実際に算出された最適f値に安全係数(fractional Kelly)をかけて、ロットを減らすことが推奨されます。ちなみに最適f値の半分のロットにする「ハーフケリー」が人気のようですね

 

サンプルコードでは勝手に推奨値のコメントを書かせていただきました↓w。

# 臆病者資産家向け推奨値:「0.3」

# 一般人向け推奨値:「0.5」ハーフケリー

# ギャンブラー向け推奨値:「0.8」

# カイジ向け推奨値:「1」 ざわ…ざわ…

 

ケリー基準・複利運用は基本的にハイリスクなので推奨できない。でも、ビットコインFXする人には敢えてオススメしたい。

ここまで書いてきましたけど、ケリー基準(オプティマルf)・複利運用は真面目に資産運用したい人にはリスクが高くてオススメできないです。資金を増やすことを念頭に置いた考え方であって、破綻する可能性がある手法だからです。

でも、ビットコインFXに挑戦する人には「少額余裕資金でやる」という条件付きで敢えて推奨したいです!w

 

ぶっちゃけ、安全な資産運用をする金融商品は世の中にいっぱいあると思うんです。堅実な運用はそっちでやればいい。敢えてビットコインFXに挑戦する人って、未熟な新しい市場を狙って一攫千金を狙ってる人が多いのかなって思うんです。

人生9割手堅くいっても、残り1割くらいは冒険するのも楽しいんじゃないかと(人生の10割を博打で生きるカイジ・アカギ系の人は止めませんので、自己責任でご自由にw)。

 

私も色々な取引所でbot動かしてみてるので、1個はケリー基準で動かしてみようと思ってます(bitFlyerは先物も出来たみたい(まだよく見てない)だし、そっちメインにして、今のFXの方で10万スタートとかで動かしてみようかな?。結果はまた後で追記するかもですw)。

夢のあるマーケットなわけですから、夢を見るようなbotが動いてもいいのかなってw( *´艸`)