AIでFXのトレード判定実装したらゼニの匂いがしてきた
前回の記事でFX(為替)のレートと速報ニュースの関係についてデータを調査してみたが、今回は速報ニュースを受けたらすぐに機械学習(AI)のNLPモデルで分類して、ポジションの命令を出せるようなシステムを考えてみる。基本の考え方は前回の記事に詳細を載せている。 今回は機械学習の実装や詳細は書かないこと …
今回のような検証は多分何十年も前からいろんな人にやり倒されてきたことかと思うが、ここであえて書いてみる。今回はプログラミングは無関係だ。ていうかPythonも無関係だ。
自分は10年ちょいくらい前にFXで多額のお金を溶かしてしまった人間だ。と言っても数百万円程度だが、若かりし自分にとっては首吊りレベルに落ち込んだ。あれから月日はたったが、あのときのトラウマからFXで勝つことは不可能とさえ思っている。以下のような記事で、AIでFXの取引を行うという検証を行っているところだが、投資金額はものすごく少なくしている。
いろんな情報を収集したり、テクニカル分析を駆使して自信満々にポジションを持って、朝起きたら給料数か月分が吹き飛んでてオハギャーみたいなのは二度と経験したくないんものだ。以下の内容は、トレーダー達は誰でも知っていることだろうけど、無知な私が気付いたことを書きたい。
ポジションをいつ持つか、LかSかなどの判断が間違えているのか原因は定かではないが、ひとまず何も考えずにコイントスで ランダムに意思決定する場合 を考えてみる。そして膨大な試行回数で一体どのくらいの期待値になるのかを調査してみる。
まず、為替レートだけど次のようなドル円の1分ごとのCSVデータを用意した。また期間は2012/1/1~2021/12/31までの10年間とした。
USDJPY,20190212,221000,110.46,110.46,110.46,110.46,4
USDJPY,20190212,221100,110.46,110.46,110.46,110.46,4
USDJPY,20190212,221200,110.46,110.46,110.46,110.46,4
USDJPY,20190212,221300,110.46,110.46,110.46,110.46,4
USDJPY,20190212,221400,110.46,110.46,110.46,110.46,4
USDJPY,20190212,221500,110.46,110.46,110.46,110.46,4
...
そして次のようにロードして使用する。
def get_csv_data():
with open(f'USDJPY.csv') as f:
reader = csv.reader(f)
rate_arr = []
for row in reader: rate_arr.append(row)
return rate_arr
次にpythonでの乱数により、ロング、ショート、何もしないをランダムに決定させる。1はロング、-1はショートとする。
def get_desition():
rv = random.random()
if rv < (1 / 360): return 1
elif rv >= (1 - (1 / 360)): return -1
return 0
今回意思決定を1分に一回行うようにするので、6時間に1回はドル円をロングorショートする確率になる。
そしてポジションを持ってから損切りなど一切せずにちょうど6時間後に決済する。
def get_profit(csv, i, desition):
spread = 0
start = float(csv[i][3])
last = i + 360
if last >= (len(csv) - 1):
last = len(csv) - 1
end = float(csv[last][3])
spread = (end - start) * desition
return spread, last
コードの詳細はどうでもいいけど、要は6時間ポジションを持った場合の損益の幅と、決済時点のindexを返している関数だ。
次のコードでシミュレーションしてみる。そして試行回数1000回として最終的な収支の平均を計算する。なお、スプレッド手数料やスワップは無視する。
initial = 10000000 # 初期投資額1000万円
leverage = 3 # レバレッジ3倍
unit = 10000 # 取引通貨単位1000通貨
trials = 1000
if __name__ == '__main__':
csv_data = get_csv_data()
amount_sum = 0
for n in range(trials):
amount = initial
last = 0
for i, c in enumerate(csv_data):
if i < last: continue
desition = get_desition()
if desition == 0: continue
rate = float(csv_data[i][3])
position_unit = math.floor((asset_sum * leverage) / (unit * rate))
if position_unit == 0: break # 退場
spread, last = get_profit(csv_data, i, desition)
amount += position_unit * unit * spread
amount_sum += math.floor(amount)
print(amount_sum / trials)
1000万円投資を10年×1000回行った結果、以下のようになった。
平均収支 | 期待値 | 一時的な最大資産額 | 一時的な最小資産額 | 退場回数 |
---|---|---|---|---|
+98,232円 | 100.98% | 73,534,300円 | 1,119,500円 | 0回 |
当たり前すぎて全く意味はないんだけど、当然期待値は100%に収束する。現実のスプレッド手数料を考慮すると期待値はもう少し下がる。しかし私のような投資ド下手人間よりもはるかに収支がよい。しかも一時的とは言え7倍以上に資産を増やしている。てか、1000万円も無心でFXのランダム取引に突っ込める人なんて存在するのか。
実際にレバレッジ3倍程度で取引するような賢い人は置いといて、FXなんて触るような多くのジャンキー達はレバレッジ10~20倍、人によっては海外FX会社で100倍以上とかで取引するのではないだろうか?なので全く同じ条件でレバレッジ10倍、20倍、100倍で、10年×1000回行った場合を計算してみる。
leverage = 20 # 10 or 20 or 100
レバレッジ | 平均収支 | 期待値 | 一時的な最大資産額 | 退場回数 |
---|---|---|---|---|
10倍 | -2,666,752円 | 73.3% | 714,204,000円 | 135回 |
20倍 | -8,745,217円 | 12.5% | 3,734,987,699円 | 847回 |
100倍 | -9,994,643円 | 0.05% | 14,572,122,800円 | 1000回 |
レバレッジを上げるだけで期待値は下がる。しかも レバを上げれば上げるだけ期待値が下がる わけ。それも当然で退場回数を見てほしい。つまり、もう取引ができないくらいに資産がなくなった状態になったら終了なので、レバレッジを上げて退場確率が上がれば平均収支は下がってしまう。特にレバレッジ100倍なんて、 10年間取引を続けられた回数は0回(全部退場している)というえげつない結果に 。ただし、一時的になんと140億円まで増えてます(笑)。
私なら退場するときに「プラス140億円でやめてればなぁ」と言いながら樹海に向かうことでしょう。
上記のようにレバレッジ3倍でドル円を取引していれば、ランダム確率の期待値100%程度になるのに、10倍にした途端期待値は73%になってしまう。そしてレバ100倍とかにすると、全敗。100%の確率で全財産を失っている。私を含めたあなたのような一般人が、いつ、どのレートでロングするかショートするかの投資判断が上手くはずがない。もしかしたらランダム(期待値100%)よりはほんの少し良いポジション判断ができるかもしれないが、レバレッジを10倍以上にしている時点で期待値は100%以下になると考えた方がよい。しかも感情がある以上誤った投資判断をしてしまうことはよくあることだ。
取引通貨の単位(通常は10,000通貨)がなければ、レバレッジが高くても期待値は確率的に100%に収束するはずだ。なぜなら極限まで単位が小さい場合、「退場(0円になること)」することがなくなるからだ。0.0001ドルとか0.0001円で取引できると仮定した場合、退場することなくひたすら試行を重ねることができるはずなので、期待値は数学的には100%のはずってことだ。ただし、レバがデカくなるとボラティリティが大きくなるので、少ない試行回数では収束しない。その証拠にレバレッジ10倍、取引単位1で確かめたところ以下のようになった。
leverage = 10
unit = 1
レバレッジ | 平均収支 | 期待値 | 一時的な最大資産額 | 退場回数 |
---|---|---|---|---|
10倍 | -316,019円 | 96.8% | 3,004,282,686円 | 0回 |
レバレッジ10倍でも、退場することなく期待値を100%に近付けることができる。ただし、レバレッジが20倍以上になると試行回数が多くないと確率が収束しないし、上記のように取引単位が1ですら影響が無視できない(取引単位の小数点が必要)。
まとめると、以下によりほとんどの一般人はFXで利益をあげることができないと考える。
ちなみ、損切りとか逆指値利益確定(逆指値ラインを釣りあげて行って利益確定)という手段を取った場合の期待値はどう変化するか?上記はポジションを取ってから6時間後に問答無用で決済としたが、仮にレートが0.25%損に動いた場合は損切り、0.35%以上含み益が出た場合は利益確定のための逆指値ラインをレートの変動と共に上げていくというルールにした場合の期待値等は以下になる。
平均収支 | 期待値 | 一時的な最大資産額 | 退場回数 |
---|---|---|---|
-1,136,520 | 88.6% | 79,300,899円 | 0回 |
予想に反して、期待値は「6時間後に強制決済」より大きく下がった。損切りとか絶対重要だと思うんだけど、ランダムに取引を開始する場合、かえって悪影響なのかも。わからん。
レバレッジ3倍以内でしかも毎日たくさんの情報収集・分析を行った上で、さらに機械のように無感情でトレードできる人は利益を上げられるのだろう。私にはそんなことはできない。レバ1~2倍くらいでやる場合、たくさんの経済情報を調べて、100万円くらいの投資額でポジションを持ち、ハラハラしながらレートと睨めっこし、運よくドル円1円の幅を取れたとして、たったの10,000円の利益ですわ。やってらんねーよ。また、もっと投資額を増やしたとしても、“含み益数百万"になっている時点でいてもたってもいられず利益確定してしまうタイプです。はい。
私のような凡人にとってはFXはパチンコや競馬のような娯楽ギャンブルってこと。少なくとも以下の記事のように、システムトレードの精度を高めたほうが私にとっては良さそう。
前回の記事でFX(為替)のレートと速報ニュースの関係についてデータを調査してみたが、今回は速報ニュースを受けたらすぐに機械学習(AI)のNLPモデルで分類して、ポジションの命令を出せるようなシステムを考えてみる。基本の考え方は前回の記事に詳細を載せている。 今回は機械学習の実装や詳細は書かないこと …
FXのシステムトレードについて、私はほぼすべてを信用していない。おそらく巨大なファンドがお金をかけて開発したシステムやごくごく一部の個人トレーダーがひたすら時間をかけて作ったシステムはもしかしたら稼げるのかもわからないが、その他のネット上に転がっている「FX自動売買システム」は誰でも簡単に儲けられ …