Pythonとpandasとは

Pythonは、読みやすさを重視した汎用言語で、データ分析で最もよく使われます。 その中で表形式のデータを扱う定番の道具が pandas です。エクセルの表をプログラムから操作する、と考えると近いです。

MT5やTradingViewは価格データを内部に持っていましたが、Pythonはデータを持っていません。だから、どこかから手に入れたCSVファイル(第6回で扱います)を自分で読み込むところから始めます。この「データを自分で用意する」点が、柔軟さの源であると同時に、注意が必要な点でもあります。

CSVを読み込む

CSVは、値をカンマで区切って並べたテキストのデータファイルです。TradingViewやJForexからダウンロードした価格データは、たいていこの形式です。pandasの read_csv で一発で読み込めます。

Python: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列から「日」だけを取り出した新しい列を作っておきます。

Python:列の取り出しと日付の作成
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 から順に増やしながら、各行で同じ処理を実行します。

表(データフレーム) time dom close 01-24245010 01-25255024 01-28285060 02-0115075 02-0335088 1行ずつ for文で判定 if dom >= 25 … 同じ役割: MQL5 = OnTick Pine = 足を自動で Python = for文
「1行(1本)ずつたどって判定する」役割は3環境共通。Pythonではそれを自分のfor文で書く
Python:for文とif文
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から順に」という意味です。

CSV DataFrame 1行ずつ検証 表データにしてから、過去チャートを順番になぞる
Python検証では、価格データを表として読み込み、行ごとにルールを確認します。

リターンを計算する

検証の目的は、売買が何%の利益・損失を生んだかを集計することです。買った価格と決済した価格が分かれば、リターンは「決済価格 ÷ 買った価格 − 1」で出せます。1.02なら+2%、0.98なら−2%です。

Python:1回の売買のリターン
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 で途中の値を確認しながら進めます。きれいな数字が出ても、まず疑う姿勢は変わりません。

チェックリスト

次の記事に進む前に、以下が自分の言葉で説明できるか確認してください。

ミニテスト

最後に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%です。順序を逆にすると意味が変わるので注意します。