こんにちはイチケンです。
Pythonで仮想通貨自動取引を始めようと思っています。手始めにアルゴリズム確認用として、ボラティリティから一分足データを出力するシミュレータ作成と、出力データをローソク足に加工します。
この記事でわかること
次のことがわかります。
- 仮想通貨相場シミュレーションデータを作成する方法
- ローソク足チャートを出力する方法
実際の相場とは全く関係ないシミュレーション値ですのでご注意ください。あくまでもアルゴリズム確認用の位置付けです。
ざっくり次の要素にわかれます。
- mplfinanceのインストール
- pandasとnumpyで-1か1を1分間隔で1年分出力
- 設定したボラティリティを1分あたり変動率に変換
- 1分変動率を1年分の-1 or 1にnumpy累積積
- pandasで1週間足4本値(始値、終値、高値、安値)に変換
- mplfinanceで変換データをローソク足チャート出力
コードのところはまとめてサンプルコードとしてのせてますので、そのままコピペ可です。
前提条件
まず前提条件となる私の環境です。
- M1 MacBook Air
- macOS 11.4
- VSCode 1.55.2
- Homebrew 3.1.9
- Python 3.8.2(venv)
- pip 21.1.2(pip3)
- numpy 1.20.3
- pandas 1.3.0.dev0+1761.ga811c9694a
- matplotlib 3.4.2
- mplfinance 0.12.7a17
venv仮想環境作成
必要に応じて仮想環境を作成します。仮想環境を使わない人はスキップしてください。
私はPython標準のvenvで次のような構成にしました。
- python_envs: 仮想環境をまとめる用のフォルダ
- trade: 今回の仮想通貨自動取引用の仮想環境
- trade_pub: ブログ用にtrader仮想環境の再検証用
仮想環境自体はVSCodeで自作フォルダpython_envsを開いて、VSCodeのターミナルで作成コマンドうつだけです。
trade_pub部分が仮想環境フォルダ名になりますので、作りたいフォルダ名に変更してください。
python3 -m venv trade_pub
VSCodeのPythonインタープリタ選択から、作成した仮想環境を選択します。
すでにターミナルが立ち上がっている場合は立ち上げ直しましょう。正しく仮想環境が適応されるとターミナルに(環境名)が表示されます。
mplfinanceインストール
mplfinanceにはmatplotlibとpandasが必要です。WinやLinuxはpipインストールするだけですが、M1Macはスッタモンダしましたのでこちらを参考にしてください。
M1Macにnumpy | matplotlib | pandasをインストールmatplotlibとpandasがインストールできたらmplfinanceをインストールします。
pip3 install mplfinance
ローソク足チャート出力サンプルコード
では前準備ができたのでローソク足チャートを出力してみましょう。サンプルコードはこちら。
import numpy as np
import pandas as pd
import mplfinance as mpf
# 期間
data_range = pd.date_range('2021/01/01', '2021/12/31 23:59', freq='T')
# data_range期間分の-1,1を生成
dn = np.random.randint(2, size=len(data_range))*2-1
print(dn)
print(dn.size)
p0 = 100 # 初期値
vol = 1.5 # ボラティリティ
# ボラティリティを分変動率に変換
vol_m = vol/np.sqrt(365*24*60)
print(vol_m)
# 幾何ランダムウォーク累積積
gwalk = np.cumprod(np.exp(vol_m*dn))*p0
print(gwalk)
# 1週間足の4本値データ算出
df = pd.Series(gwalk, index=data_range).resample('1W').ohlc().dropna()
print(df)
# ローソク足表示
mpf.plot(df, type='candle')
実行するたびにボラティリティ設定に応じて1年分の週間足ローソク足チャートが出力されます。ボラティリティを0.2くらいに設定するとドル円ぽい値動きになります。
サクサク解説
では簡単に要素を解説していきます。
- pandasとnumpyで-1か1を1分間隔で1年分出力
- 設定したボラティリティを1分あたり変動率に変換
- 1分変動率を1年分の-1 or 1にnumpy累積積
- pandasで1週間足4本値(始値、終値、高値、安値)に変換
- mplfinanceで変換データをローソク足チャート出力
pandasとnumpyで-1か1を1分間隔で1年分出力
まずpandasで1分間隔の枠を設定期間分作ります。
# 期間
data_range = pd.date_range('2021/01/01', '2021/12/31 23:59', freq='T')
# data_range期間分の-1,1を生成
dn = np.random.randint(2, size=len(data_range))*2-1
print(dn)
print(dn.size)
その枠のサイズ分だけ-1か1をnumpyでランダム生成しています。numpyで0,1をランダム生成し、それに2をかけて1引いてます。これで-1と1が作れます。
期間を変えたい場合は日付部分を変更してください。
設定したボラティリティを1分あたり変動率に変換
vol = 1.5 # ボラティリティ
# ボラティリティを分変動率に変換
vol_m = vol/np.sqrt(365*24*60)
print(vol_m)
ボラティリティってつまるところ標準偏差で年変換率を示しています。1.5(150%)として置いています。
標準偏差は求めた値を年率換算(年間での変化率を計算)して使うのが一般的だ。具体的には、日次、週次、月次騰落率から計測した標準偏差について、1年=250(営業日)=52(週)=12(月)の各250、52、12の平方根を掛けた値が年率換算値になる。それぞれの平方根を掛け合わせるのは、標準偏差の2乗である分散が計測期間(時間)の長さに比例して大きくなるというランダム・ウォークの考え方に基づく。 引用: 野村證券 標準偏差・分散
この野村證券の概念を仮想通貨に適用し、営業日を365日にした上で、逆算で年変動率から分の平方根を割ることで分変動率を算出しました。
1分変動率を1年分のランダム値にnumpy累積積
準備した1年分のランダム値と1分変動率を用いて幾何ランダムウォークします。
# 幾何ランダムウォーク累積積
gwalk = np.cumprod(np.exp(vol_m*dn))*p0
print(gwalk)
これで設定ボラティリティに基づいた1分間隔のシミュレーション値を1年分出力できました。
pandasで1週間足4本値(始値、終値、高値、安値)に変換
4本値変換はpandasにその機能があります。
# 1週間足の4本値データ算出
df = pd.Series(gwalk, index=data_range).resample('1W').ohlc().dropna()
print(df)
指定した1週間単位で自動的に4本値に集計したものを出力してくれます。便利ー。
resampleの引数でまとめ直す期間を指定できます。
mplfinanceで変換データをローソク足チャート出力
最後に4本値データを使ってローソク足チャートを作成します。mplfinanceで一発です。
# ローソク足表示
mpf.plot(df, type='candle')
オプションで表示比等指定できますが、最低限これだけでも動きます。
最後に
いかがでしたか?
この記事が皆さんのお役に立てれば幸いです。さてこれをベースに近々、仮想通貨自動取引ソフトを運用開始しますよ!
0 件のコメント:
コメントを投稿