先進的なプラットフォーム研究
FMZには,ユーザがプラットフォーム API を熟知し,戦略研究を行うのを助ける jupyter ノートブックが内蔵されており,Python3 C++11/17 と Javascript の学習環境をサポートしている.Notebook+Python はデータ分析と戦略研究にほとんど不可欠な非常に強力なツールである.FMZ プラットフォームに付随するバックテストは非常に有用であるが,複雑で大量のデータを持つ戦略には適していない.この記事では,jupyter ノートブックを使用するいくつかの高度なスキルを紹介し,ランダムペア取引とマルチペア取引戦略のバックテストを実現する.
FMZ内の研究環境は使用可能だが,ネットワーク接続は不便である.ノートブックと数学計算のために一般的に使用される関連ライブラリを含むアナコンダ3を自分のデバイスにインストールすることが推奨される.ローカルネットワーク環境を共有し,より優れたパフォーマンスを有する.またGoogleコラボを使用することが推奨される.いくつかのストレージ制限があるにもかかわらず,無料で強力で,ロボット学習に関連する研究に適している.
Notebook と Python の特定の使用スキルのための多くのオンラインチュートリアルがあります. Python の定量化や jupyter notebook のチュートリアルなどのキーワードを検索することで多くの情報を見つけることができます. クローラー,データ処理,バックテスト,戦略設計,プロティングなどの一連の基礎を学び,マスターする必要があります.
プラットフォームは一般的にKラインを履歴データで取得するためのAPIを提供し,一部のプラットフォームは取引ごとに実行取引のデータも提供しています.データを取得し保存するためにクローラーを使用する必要があります.また,プラットフォームによって直接送られたデータを受信し,ローカルデータベースストレージを作成することもできます.
次に,Binanceで永続契約のK線データを取得して保存する方法を示します.
まず,Binance Perpetual Swapのドキュメントを探してください.https://binance-docs.github.io/apidocs/futures/cn/#c59e471e81. 必要なパラメータと返されたデータフォーマットを見ることができます. 通常,APIによって取得されるKラインの数は限られており,Binanceは最大1000個がありますので,ループイテレーションで取得する必要があります.他のプラットフォームの状況はBinanceに類似しています. ネットワークは海外ネットワークに接続する必要があります (中国の国内ネットワークと比較して) をクロールするためにKライン.
Binanceがサポートする期間:1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,1M
[24]:
共同ライブラリへの輸入要求 #ネットワーク要求
日時 輸入日,日時
輸入時間
パンダをPDとして輸入
[160]では:
def GetKlines ((symbol=
パンダライブラリ内の機能を利用してデータを保存・読み取ることができます.フォーマットはcsvで,Excelソフトウェアで直接開くことができます.
最高価格,最低価格,オープン価格,終了価格,実行量に加えて,Binanceが返したKラインデータには,取引総額,イニシアティブ購入金額,実行金額なども含まれます.これらは戦略を構築するために使用できる貴重な情報です.
[86]:
df.to_csv ((
ほら
[88]:
df.index = pd.to_datetime ((df.time,unit=
前回の記事では,Pythonのバックテストエンジンも提供されていましたが,ここでは最適化されたバージョンです.USDT (または他の引換通貨のマージング) 永久契約はスポット契約と非常に似ています.違いは,永久契約はレバレッジされ,負の金額を保持することができ (ショートに相当) バックテストエンジンを共有できることです.暗号のマージング配送契約は通貨で決済され,特定のバックテストを必要とするため,特別です.
ここでは,マルチシンボルスポットまたはマルチシンボル永久バックテストを実装できる簡単な例が示されています.多くの詳細は無視されています.例えば,先物レバレッジ,マージン占有,資金調達率,清算メカニズム,市場作成およびオーダーテイカー取引,およびオーダーメンテナンスなど.しかし,通常は通常のバックテスト結果に影響しません.そして,マッチングの価格と量,アカウント更新はすべて外部から輸入する必要があります.読者はこれを改善することができます.
交換クラス紹介
account:USDT は,必要でないベース通貨を示します. realised_profit: すでに実現した利益と損失; unrealised_profit: まだ実現されていない利益と損失;合計: 総資本;手数料: 処理手数料.他の取引ペアの場合は,金額 (ショートする場合マイナス数); hold_price: 保有価格;価値: 保有価値;価格: 現在の価格.
trade_symbols: 取引ペアの配列; 1つの取引ペアでパスすることもできます. デフォルトのコート通貨はUSDTですが,他のコート通貨シンボルをバックテストに使用することもできます.
料金:手渡し料金.単純に言えば,作者と受取者を区別しない.
initial_balance: 初期資産; デフォルト取引ペアの初期金額は0である.
購入機能: 購入,これは,マッチングメカニズムなしで,永続契約の長期化と短期化に対応しています.
販売機能: 販売する
アップデート機能:すべての取引ペアの価格辞書に転送する必要があるアカウント情報を更新する. [98]: クラス 交換:
def init(自己, trade_symbols, fees=0.0004, initial_balance=10000)
self.initial_balance = 初期_バランス #初期バランス
self.fee = 料金
self.trade_symbols = trade_symbols 取引する
self.account = {
def 取引 (自己,シンボル,方向,価格,金額):
cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount)
open_amount = amount - cover_amount
self.account['USDT']['realised_profit'] -= price*amount*self.fee #take out the fee
self.account['USDT']['fee'] += price*amount*self.fee
self.account[symbol]['fee'] += price*amount*self.fee
if cover_amount > 0: #close first
self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #profit
self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
self.account[symbol]['amount'] -= -direction*cover_amount
self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price']
if open_amount > 0:
total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount
total_amount = direction*self.account[symbol]['amount']+open_amount
self.account[symbol]['hold_price'] = total_cost/total_amount
self.account[symbol]['amount'] += direction*open_amount
def 購入 (自己,シンボル,価格,金額):self.Trade(符号 1,価格,金額)
def 売る (自己,シンボル,価格,金額):self.Trade(符号 -1,価格,金額)
def Update ((self, close_price): #資産を更新する
自己口座[
まず,古典的な永続格子戦略をバックテストしましょう. この戦略は最近私たちのプラットフォームで非常に人気があります. 現金格子1と比較して,通貨を保持する必要はありませんし,レバレッジを追加することができます. これは現金格子1よりもはるかに便利です. しかし,直接バックテストできないため,通貨シンボルを選択するのに有利ではありません. ここで,バックテストエンジンを今すぐ使用します.
K線期間が短くなるほど,対応するバックテスト結果は正確になり,必要なデータの量は大きくなります.読者は,バックテストしたい取引ペアにシンボルのパラメータを変更してみることができます.
[241]:
記号 =
e = 交換 (※[シンボル],手数料=0.0002,初期_残高=10000)
init_price = df.loc[0,
if kline.low < buy_price: #the lowest price of K-line is less than the current maker price; the buy order is executed
e.Buy(symbol,buy_price,value/buy_price)
if kline.high > sell_price:
e.Sell(symbol,sell_price,value/sell_price)
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount'], e.account['USDT']['total']-e.initial_balance])
res = pd.DataFrame ((data=res_list, columns=[
このタイプの戦略も比較的人気がありますが,FMZプラットフォームはマルチシンボルの戦略をバックテストするのにあまり良くないので,このバックテストエンジンを使って試してみてください.我々は4つの主流通貨シンボル,BTC,ETH,LTC,およびXRPを選択し,それぞれ市場価値の25%を設定し,1%の偏差をバランスします.
まず,過去1年の4つのシンボルの閉じる価格を取得します. ETHが最大値上昇し,他の3つは同様の上昇を示しています.これらの4つのシンボルを平均的に保持すると,最終純価値は4.5です.バックテスト後,均衡戦略は,わずかに向上した5.3の最終純価値を持っています.
[211]:
記号 = [
カメ戦略は,ポジションを追加するための完全なストップ・ロスのロジックを含む古典的なトレンド戦略です.詳細については,以下を参照してください.https://zhuanlan.zhihu.com/p/27987938バックテストのためにシンプルなバージョンを実行します.
トートルストラテジーの期間は戦略に大きな影響を持ち,あまりにも短い期間を選択することは望ましくない. ここでは6hを選択する. ドンチアンチャネル期間は5で選択し,ポジション比率はバックテストに従って0.003で選択する. 価格がチャネルのアップバンドを突破して1ユニットロングポジションを開くとき,そしてポジションを開いた後に価格が0.3波動性で上昇し続けると, 1ユニットを追加し,価格が損失を止めるために最新のオープン価格の波動性2.5を下回る.ショートオーダーの原則は同じである. ETHの大きな牛市場により,トートルストラテジーはメイントレンドを捕捉し,最終的に27倍の利益を達成し,期間中に最大レバレッジが4倍になる.
カメ戦略のパラメータは,期間と密接に関連しており,バックテストによって選択する必要があります.また,高リスクを避けるために,各時間
最終的な純価値チャートから,亀策は長期戦略であり,その間に3〜4ヶ月間利益がない場合があり,繰り返しストップ損失がある場合があることがわかりますが,一方で大きな市場価格が上がると,亀策はトレンドを利用して大きなポジションを蓄積し,トレンドの終わりまで維持し,多くの利益を得ることができます.上昇の終わりには,戦略は多くのポジションを蓄積します.この時点で,波動性は比較的大きくなり,多くの場合大きな利益が引き上げられます.亀策を使用するには,その欠点と忍耐を受け入れることが必要です.
[424]:
記号 =
if kline.high > kline.up and e.account[symbol]['amount'] == 0: #first time to open long position
e.Buy(symbol,kline.up,unit) #notice the trading price here
last_price = kline.up
if e.account[symbol]['amount'] > 0 and kline.high > last_price + open_times*kline.N: #long position, buy in
e.Buy(symbol,last_price + open_times*kline.N,unit)
last_price = last_price + open_times*kline.N
if e.account[symbol]['amount'] > 0 and kline.low < last_price - stop_times*kline.N: #long position, stop loss
e.Sell(symbol,last_price - stop_times*kline.N,e.account[symbol]['amount'])
if kline.low < kline.down and e.account[symbol]['amount'] == 0: #open short
e.Sell(symbol,kline.down,unit)
last_price = kline.down
if e.account[symbol]['amount'] < 0 and kline.low < last_price - open_times*kline.N: #short position, buy in
e.Sell(symbol,last_price - open_times*kline.N,unit)
last_price = last_price - open_times*kline.N
if e.account[symbol]['amount'] < 0 and kline.high > last_price + stop_times*kline.N: #short position, stop loss
e.Buy(symbol,last_price + stop_times*kline.N,-e.account[symbol]['amount'])
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount']*kline.close, e.account['USDT']['total']])
res = pd.DataFrame ((data=res_list, columns=[
jupyterノートブック研究プラットフォームを使用することに精通している場合は,データ取得,データ分析,戦略バックテスト,チャート表示など,量的な取引への避けられない方法である操作を簡単に実行できます.今,戦略書き方について手がかりがない場合は,まずデータを分析することもできます. 初心者向けに推奨するリソース:
Python を使ってデータ解析を行います.https://wizardforcel.gitbooks.io/pyda-2e/content/
Pythonの定量チュートリアル:https://wizardforcel.gitbooks.io/python-quant-uqer/content/
[ ] で: