2023年4月17日月曜日

仲値後の曜日の影響

t検定を用いて、仲値後の曜日が取引結果に及ぼす影響を調査してみました。

使用したサンプルデータは、9:55にドル円ショートの取引を行い、一定時間後にクローズするという単純な取引結果でした。


2005年以降の4670回の取引データを確認した結果は以下のようになった。



時間軸を考慮しない単純移動平均(SMA)及び加重移動平均(LWMA)を用いて、取引成績に対して曜日による影響を分析しました。その結果、金曜日には有意に高い成績が見られる一方、火曜日には有意に低い成績が観察されました。

統計的有意差があるかをt検定で調べてみた。

p値が0.05以下の場合有意差があるということになる。




t検定を用いて統計的な有意差を検証した結果、金曜日においては有意差があることが明らかとなりました。一方で、火曜日については有意差は認められませんでした。












2023年3月30日木曜日

いまさらながらのAUDNZD その2

AUDNZD 

H-Lの平均ボラティリティ(High÷Low) 年月

色は赤:大きい 黄色:普通 緑:小さい


2008後半 ~ 2009前半は、非常にボラティリティが高い!

※バックテストのチャートを見ると2007-2009に急成長し、あとはなだらかというグラフがあるが、この時期はボラティリティが高いので利益・損失が大きくなる。その結果2007-2009に最適化されてしまい、運用すると期待外れになりやすい。AUDNZDも同様の傾向 2010年以降の最適化がよさそうです。

年(時期)による影響は強いが、月による影響はないようだ。


2023年3月28日火曜日

いまさらながらのAUDNZD

AUDNZDについてTACA的分析とその備忘録

( ..)φメモメモ

※時間はすべてMT4時間(GMT+2/+3)です。

①通貨の平均的な動き


2005.4-2023.3(途中)データを平均化

一日の動きはこのような感じになりました。

オレンジ:Close-Open(終値から始値を引いた値 動きを確認)

  1. 0時から6時まで上昇(オセアニア時間)
  2. 6時から11:30まで下降
  3. 11:30から14時まで上昇
  4. 14時から下降
  5. 15時下降その後回復(アメリカ指標発表に伴うスプレッド拡大が影響)
グレー:High-Low(高値から安値を引いた値 ボラティリティを確認)

  1. 0時から5時まで高め(オセアニア時間)
  2. 8時ごろから上昇(ロンドン開始)
  3. 15時から17時上昇(NY指標発表?)
  4. 22時上昇(ノイズ?)
22時を分析
動きの大きなものトップ10のうち7個が水曜日うち3個はFOMC日程(時間は異なる)でした。
ノイズではないようです。



2023年1月25日水曜日

MT5 Tickが動いた理由の検証

 MT5はいろいろな理由でティックが動きます。

ティックが動いた理由はMqlTick構造体にSymbolInfoTick()変数で値を代入し、flagsを見ることで確認できます。


フラグの値は2進数です。




Tick.flagsの確認は以下のコードような流れになります。

void OnTick()
   {
   MqlTick Tick; //TickをMqlTick構造体に宣言
   SymbolInfoTick(Symbol(),Tick);//Tickのメンバに値を代入
   Comment(Tick.flags);//Tick.flagsの値をコメントに表示
   }

実際に表示すると2や4が表示されますが6も表示されます。
Bid,Ask両方の価格が変更されると6になります。

また、まれに0が戻ってくることがあります。
理由なきティックということでしょうか!



MT5取り扱いのFX会社4社でどのような数字が戻ってくるか確認しました。



0:理由なし

2:Bid価格変更

4:Ask価格変更

6:Bid+Ask価格変更


外為ファイネストは98,100,102と不思議な数字が出ています。

98=2+32+64 /100=4+32+64 102=6+32+64

32:買い取引

64:売り取引

外為ファイネストは常に売り買い取引のフラグが立っているようです。



どの業者でもTICK_FLAG_BID=2が立っていることを条件にする場合ビッド演算子を使います。

void OnTick()
   {
   MqlTick Tick; //TickをMqlTick構造体に宣言
   SymbolInfoTick(Symbol(),Tick);//Tickのメンバに値を代入
   if((Tick.flags & TICK_FLAG_BID)==TICK_FLAG_BID)
      Print(Tick.flags,"True");
   else
      Print(Tick.flags,"False");
   }

ビッド演算子 &は 2進数の同じ桁の数字が両方1の場合1になります。


例)0b0011 & 0b0110 -> 0b0010

0b0011

0b0110

---------

0b0010

 

先頭0bは2進数という意味です。

一番左の桁は両方0なので0になります 0&0 -> 0

左から2つ目の桁は0と1で0になります 0&1 -> 0

左から3つ目の桁は1と1で1です  1&1 -> 1

一番右の桁は 1と0で0です 1&0 → 0

0b0011 & 0b0110結果は0b0010になります。 

---------------------------------------------------

難解ですが二進数のフラグを調べるには便利な方法です。

ややこしいので例を4つほど記述します。


Tick.flags=2の場合 2は0b0010

TICK_FLAG_BID=2  2は0b0010

Tick.flag & TICK_FLAG_BID ->0b0010 = 2


Tick.flags=4の場合 4は0b0100

TICK_FLAG_BID=2   2は0b0010

Tick.flag & TICK_FLAG_BID ->0b0000 = 0


Tick.flags=6の場合 6は0b0110

TICK_FLAG_BID=2  2は0b0010

Tick.flag & TICK_FLAG_BID ->0b0010 = 2


Tick.flags=15の場合 6は0b1111

TICK_FLAG_BID=2  2は0b0010

Tick.flag & TICK_FLAG_BID ->0b0010 = 2


















2022年11月12日土曜日

過去データーの前処理 MT4からDLしたデーターが100万行を超える時

 MT4の過去データーをCSVにダウンロードしてEXCELで分析します。

EXCELは100万行(正確には104万8576行)までしか取り扱うことができません。

MT4からDLしたCSVは古いデータから新しいデータの順で並んでいるため、最近のデーターが削除されます。

ex.)2005.1~のM5のデーターをエクセルで開けると2019.5までしか入りません。

そこで、EXCELをつかって新しい方から順にデーターが残るようにします。

①エクセルを立ち上げる → 「データ」 →「テキストまたはCSVから」

②ファイルを選んで「インポート」

以下のようなサブ画面が立ち上がります。


③「データーの変換」

Power Queryエディターが立ち上がります。


④Coloum1の▼をクリック → 「降順で並び替え」

⑤左上「閉じて読み込む」をクリック

しばらく待ちます。(30秒-1分程度)

このクエリによって返されたデータはワークシートに入り切りません。が表示されたら「OK」をクリック

タブが増えてデーターが入ります。

テーブルに、なっているため色がついています。

日時もしっかり、EXCEL形式に変換されます。嬉しいおまけです。





2022年10月28日金曜日

MT5をPYTHONで操作しよう②

 前回はPythonでMT5にログインをしました

MT5TOKIO MT5をPYTHONで操作しよう①

今日はMT5からデーターを取得しグラフにします。

①初期設定

#pip install MetaTrader5

import MetaTrader5 as mt5

from datetime import datetime

import matplotlib.pyplot as plt

mt5.initialize()

詳しくは前回の記事を御覧ください。

②過去データーの取得

copy_rate_range()に通貨ペア 時間足 取得開始日時 取得終了日時を与えます。

usdjpy = mt5.copy_rates_range("USDJPY.ps01",mt5.TIMEFRAME_M1,datetime(2022,10,15,20), datetime(2022,10,24,12))

※通貨ペアはUSDJPYだけでなくサフィックス(今回はフィリップ証券を使用していますので.ps01)が必要です。
時間足の記述はmt5.TIMEFRAME_xxです。
取得開始日時、取得終了日時はdatatime を使用します。

作画についてはmatplotlibを調べてください。

MT5はスプレッドが記録されるのが特徴ですので、介入時のスプレッドを見てみます。

赤線:USDJPYレート
青線:スプレッド

介入時にスプレッドがおもしろい上がり方をしています。
Pythonはデーターの扱いが簡単ですので、MT5では苦労することも簡単にできますね

全コード

#pip install MetaTrader5
import MetaTrader5 as mt5
from datetime import datetime
import matplotlib.pyplot as plt
mt5.initialize()
usdjpy = mt5.copy_rates_range("USDJPY.ps01",mt5.TIMEFRAME_M1,datetime(2022,10,15,20), datetime(2022,10,24,12))
close=[]
spread=[]
for i in list(usdjpy):
    close.append(i[1])
    spread.append(i[5])
fig = plt.figure()
ax1 = fig.subplots()
ax2 = ax1.twinx()
ax1.plot(close,color="red")
ax2.plot(spread,color="blue",lw=1)
plt.show()
mt5.shutdown










2022年10月26日水曜日

MT5をPYTHONで操作しよう①

MT5はEA開発者にとって最適化が複数のコアででき時間短縮のメリットがありますが、コードがややこしいことは大きなハードルになっていると思います。

そのためかMT5にはcTrader ライブラリーが標準で組み込まれていたり、Pythonで操作できるパッケージが用意されています。

今回はPythonをつかってMT5にログインをします。


環境

MT5(フィリプ証券)build 3446
Windows 11 Pro 21H2 22000.1098
Jupyter Lab 3.2.9
Python 3.8.10


準備①

MT5の設定

「ツール(T)」→「オプション(O)」



アルゴリズム取引を許可にチェックを入れる
外部Python APIを介したアルゴリズム取引を無効にするのチェックを外す




準備② ライブラリーのインストール

pip install MetaTrader5

※pipが古くつまずきました うまくいかない特はアップグレードしてください。


MT5の接続

import MetaTrader5 as mt5

mt5.initialize()


initialize()でMT5と接続されます。成功したときはTrueが表示されます。

※MT5が起動していないときは最後に起動したMT5が起動します。

PCに複数のMT5をインストールしてあり、起動したいMT5を指定する場合

mt5.initialize('C: ~フルパス~')


MT5 バージョンの確認

mt5.version()

結果は(500, 3446, '24 Sep 2022')が返ってきました。


MT5 ログイン 

mt5.login( xxxxxxx, password="yyyyyyy", server="trading.phillip-mt5.jp:443")

ログイン情報を入れてください。 xxxxxxxx はログイン:に入れる値 yyyyyyはパスワード:に入れる値 serverはサーバー:に入れる値です。


※ログインしなくても価格などは取得できるようです。
ログインすることで取引ができるようになります。












2022年10月25日火曜日

為替介入について

 最近為替介入で相場が楽しくなってきています。

あらためて介入ってなんだろうと思い整理をしてみました。


為替介入とはなんですか 日銀

目的:為替相場の急激な変動を抑え、その安定化を図ること

※目的は価格操作ではなく、ボラティリティを抑えることです。

誰がする:財務大臣の判断で日銀、もしくは海外の通貨当局が実行します。

資金は?:円安の場合 外為特会の保有するドル資金を売却して、円を買い入れる

※資金は無限ではないようです。19兆円(日経新聞)程度との予測もあります。
9/22 2.8兆円(Bloomberg) 10/21 5.5兆円(毎日新聞
残り10.7兆 22日も大きな動きがありましたのでもう資金が底をついているかもしれません。


過去の介入状況は?

ドル買いの日別介入日回数です。
報告は1日に複数回介入してもまとめられますので日別でだしています。


輸入業者は支払い日までにドルを手に入れる必要があります。
締め日が多い25日に介入が少ないのは日銀の配慮でしょうか

今回のような円買いの介入は32回しかありませんので、データとして貧弱です。

曜日別

※月金が多いようです。


今回も10/21(金) 10/25(月)でしたね。

 



2022年8月25日木曜日

SAXO BANK APIの接続 for Excel

SAXO BANK証券

SAXO BANK証券(以下SAXO)はデンマークの会社です。SAXOさんが作った会社らしいのですが、SAXO性はアングロサクソンのサクソン、ザクセン人でイギリスに渡らなかった人の末裔と思われます。
話がそれましたが、SAXOは米株オプションやが通貨オプションなど商品が豊富です。さらにFXは月朝3、4時から取引開始とかなりチャレンジャーな会社です。(MT4は普通です)
ツールも豊富ですが、9月頭でMT4は一部利用者以外終了の予定です。代わりになにかできないかと相談したところAPIを教えていただいたので接続までを紹介します。今回はEXCELにポジションを表示する方法です。まぁ、英語のマニュアルがあるのでその通りやるだけですが、引っかかったところなどありますのでお役に立てば幸いです。



①SAXO TRADERGOにログイン


英語のマニュアルはDEMO口座ですがこちらは本番口座で進めます。



②APIの使用を有効にする

「口座管理」 → Open API Data Access「開く」 → 「有効にする」
*無効にするとなっていた場合は、既に有効になっています



③Add-inのダウンロード

以下リンクからダウンロードします。
32ーBitと64ーBitがあります
解凍して保存してください
ファイル名はOpenApi-AddIn-64bits.xll 
拡張子xll はEXCELアドインです




④Add-Inのインストール

EXCEL起動 → 左下「オプション」 →左下「アドイン」 → 管理「設定(G)...」 → 「参照」ダウンロードしたOpenApi-AddIn-64bits.xll が保存されている場所に移動 →「OK」

OpenApi-AddIn-64bits.xllを起動 
ログインします
リボンの「OpenApi」 → 「LogIn」
※デモ口座の時は「SIM」本番口座の時は「LIVE」を選んでください

ログイン後「ファイル」 → 「空白のブック」を作成
「Formula Builder」が押せるようになりますので押下

Service , Endpoint のプルダウンを画像と同じようにセット
Fields に画像と同じように8個追加
最後に右下「Insert Formula」を押下


先ほど作成した空白のブックにポジション情報が表示されます。
※ポジションを持っていない時はなにも表示されません。




「おまけ」途中ハマったところ
・英語のマニュアルはDEMO口座での解説でしたので、本番口座で使う方法がわからずなやみました。SAXOに確認したところSIMをLIVEに変更するとできると教えていただきました。
・最後の画像は本番口座ですが、はじめはデモ口座で進めました。ポジションが表示されずなやみましたが、ポジションを持っていないことに気が付きSaxoTraderGoで発注したところすぐにEXCEL側に表示され解決



手順どおりやれば簡単です。ポジション管理などに便利ではないでしょうか
また、自動売買も可能なようですのでMT4の代わりにチャレンジするのも面白いかもしれません。

























2022年7月11日月曜日

上位足の過去データ取得問題

 M1で動作するEAでM5のデータを参照する時

EAをM1のチャートのセットしてからM5のデータをダウンロードするのに数ティック時間が必要です。

上位足のデータがダウンロード済みの場合は問題ありませんが、ダウンロードまでの数ティックに誤動作が発生しないように気をつける必要があります。

2022年6月2日木曜日

バックテストレポート MODIFYの削除

とあるバックテストの分析を試みたのですが、ファイルサイズが250Mと巨大でした。

原因はmodifyが大変多く、容量、行数ともに膨大に

そこで、modifyの行をPythonで削除することにしました。

以下コード

inputFile = r'StrategyTester.htm'       # 読み込みファイル
outputFile = r'StrategyTesterNew.htm'   # 書き込みファイル
for line in open(inputFile):
    if 'modify' in line:
        continue
    else:
        with open(outputFile, mode='a') as f:
            f.write(line)


コードはこちらを参照させていただきました。
ありがとうございます。

https://akatsuki1024.hatenablog.com/entry/2020/12/13/201612



上:オリジナル

下:MODIFY削除

容量が98%減できました!