Pythonとpandasとは
Pythonは、読みやすさを重視した汎用言語で、データ分析で最もよく使われます。
その中で表形式のデータを扱う定番の道具が pandas です。エクセルの表をプログラムから操作する、と考えると近いです。
MT5やTradingViewは価格データを内部に持っていましたが、Pythonはデータを持っていません。だから、どこかから手に入れたCSVファイル(第6回で扱います)を自分で読み込むところから始めます。この「データを自分で用意する」点が、柔軟さの源であると同時に、注意が必要な点でもあります。
CSVを読み込む
CSVは、値をカンマで区切って並べたテキストのデータファイルです。TradingViewやJForexからダウンロードした価格データは、たいていこの形式です。pandasの read_csv で一発で読み込めます。
import pandas as pd # pandasを pd という短い名前で使う
df = pd.read_csv("SP_SPX_1D.csv", parse_dates=["time"])
print(df.head()) # 最初の5行を表示して中身を確認
import は道具の読み込み(MQL5の #include に相当)。df は読み込んだ表を入れる変数で、data frame の略としてよく使う名前です。parse_dates は「time列を日付として読んで」という指定です。
df.head() で最初の数行を見て、列の名前(time, open, high, low, close など)が想定どおりかを必ず確認します。ダウンロード元によって列名や日付の形式が違うので、この確認を飛ばすと後でつまずきます。
列を取り出す・日付を作る
表の1つの列は df["close"] のように、角かっこと列名で取り出せます。月末ロングではその行の日付(1〜31)が必要なので、time列から「日」だけを取り出した新しい列を作っておきます。
df = df.sort_values("time").reset_index(drop=True) # 日付順に並べ直す
df["dom"] = df["time"].dt.day # 各行の「日」(1〜31)をdom列に入れる
.dt.day は日付から「日」を取り出す指定。Pineの dayofmonth、MQL5の dt.day に当たります。sort_values で古い順に並べ直しておくのが安全です。
for文で1行ずつたどる
MQL5では OnTick が繰り返し呼ばれ、Pineは足を自動でたどりました。Pythonではその繰り返しを自分で書きます。それが for文です。表の行番号を 0 から順に増やしながら、各行で同じ処理を実行します。
for i in range(len(df)): # 0行目から最後の行まで繰り返す
dom = df.loc[i, "dom"] # i行目の日付を取り出す
close = df.loc[i, "close"] # i行目の終値を取り出す
if dom >= 25:
print(i, "買い条件を満たす")
Pineと同じく、Pythonも波かっこを使わず字下げでfor文やif文の範囲を表します。range(len(df)) は「行数ぶん、0から順に」という意味です。
リターンを計算する
検証の目的は、売買が何%の利益・損失を生んだかを集計することです。買った価格と決済した価格が分かれば、リターンは「決済価格 ÷ 買った価格 − 1」で出せます。1.02なら+2%、0.98なら−2%です。
entry_price = 5024.0 # 買った価格
exit_price = 5088.0 # 決済した価格
ret = exit_price / entry_price - 1
print(f"リターン: {ret*100:.2f}%") # → リターン: 1.27%
f"...{ret*100:.2f}%" は、計算結果を小数点2桁で文章に埋め込む書き方です。*100 で%表示にしています。
第7回・第8回では、MT5とTradingViewが損益を自動で集計してくれました。Pythonではこの集計も自分で書きます。決済のたびにリターンをリスト(値をためる箱)に足していき、最後に平均・勝率・累積を計算します。第9回で、その全体を組み立てます。
Pythonはデータの用意から集計まで全部を自分で書くので、柔軟な反面、間違いも入り込みやすいです。
よくあるのが、決済価格ではなく次の行の価格を使ってしまう「先読み」や、日付の並び順がずれたままたどってしまうミスです。
だからこそ第1回で述べたとおり、コードは短く、print で途中の値を確認しながら進めます。きれいな数字が出ても、まず疑う姿勢は変わりません。
チェックリスト
次の記事に進む前に、以下が自分の言葉で説明できるか確認してください。
- Pythonはデータを持たず、CSVを自分で読み込むこと
pd.read_csvで表(データフレーム)になることdf["close"]で列を取り出せること- for文が、MQL5のOnTick・Pineの足たどりに当たること
- リターンは「決済価格 ÷ 買った価格 − 1」で出せること
- 集計まで自分で書くぶん、先読みなどのミスに注意が要ること
ミニテスト
最後に3問だけ確認です。不正解なら別の選択肢を選び直せます。正解すると解説が表示されます。
Q1. Pythonでの検証が、MT5やTradingViewと大きく違う点は?
MT5やTradingViewは価格データを内部に持っていますが、Pythonは持っていません。CSVを自分で用意して読み込むところから始めます。範囲は字下げで表します。
Q2. Pythonのfor文は、MQL5・Pineの何に当たるか?
MQL5はOnTickが繰り返し呼ばれ、Pineは足を自動でたどりました。Pythonではその繰り返しを自分のfor文で書きます。
Q3. 買値5024、決済5088のリターンの求め方は?
リターンは「決済価格 ÷ 買った価格 − 1」。1.0127なら+1.27%です。順序を逆にすると意味が変わるので注意します。