この記事を読むのに約6分かかります。
Wikiで紹介されています
定量的取引とは、高度な数学的モデルを使用して人間の主観的な判断を置き換えること、およびコンピューターテクノロジーを使用して、膨大な履歴データから過剰な利益をもたらし、戦略を策定できる複数の「高確率」イベントを選択することを指します。これにより、投資家の感情が大幅に低下します。市場が非常に熱狂的または悲観的である場合に不合理な投資決定を行うことを回避するための、変動性の影響。
定量的取引は広範囲をカバーし、プログラマティック取引、アルゴリズム取引、高周波取引、自動取引プラットフォームなどはすべて定量的取引として数えることができます。
その最大の利点は、心理的な理由によって引き起こされる取引リスクを回避できることです。さらに、コンピューターはスリープせず、手動のリアルタイム取引を必要としないため、横になってお金を稼ぐ人々のビジョンを満たします。もちろん、実際の状況では、アルゴリズムの突然の失敗を防ぎ、巨額の取引損失を引き起こすために、人々によるタイムリーな介入が必要です。
プログラムを使用して定量的なトランザクションを実行する最下層は、取引のために取引所に売買要求を送信することです。ブローカーまたは取引所は通常、投資家にAPIインターフェイスも提供します。たとえば、Gemini取引所の公開見積もりAPIは、次の単純なHTTP GET要求を使用して、最新のビットコインからドルへの価格と最近の取引量を取得できます。
########## GEMINIマーケットインターフェース##########
## https://api.gemini.com/v1/pubticker/:symbol
import json
import requests
gemini_ticker ='https://api.gemini.com/v1/pubticker/{}'
symbol ='btcusd'
btc_data = requests.get(gemini_ticker.format(symbol)).json()print(json.dumps(btc_data, indent=4))
########## 出力##########
{" bid":"8825.88","ask":"8827.52","volume":{"BTC":"910.0838782726","USD":"7972904.560901317851","timestamp":1560643800000},"last":"8838.45"}
アルゴリズム取引システムの場合、APIは最下位レベルの構造にすぎません。一般的に、基本的な取引システムには、市場モジュール、戦略モジュール、実行モジュールが含まれている必要があります。戦略の開発を支援するために、通常、バックテストシステムの支援があります。分業は次のとおりです。
取引システムの各モジュールの分業
アルゴリズム取引の基本的な要件は、データを効率的に処理することです。データ処理はPythonの強みであり、特にNumpy + Pandasの組み合わせにより、アルゴリズム取引の開発者の効率が直線的に向上します。
これは、過去1時間のビットコインの価格曲線をクロール、フォーマット、およびプロットするPythonコードです。
import matplotlib.pyplot as plt
import pandas as pd
import requests
# 取得するデータの期間を選択します
periods ='3600'
# Httpを介してbtcの過去の価格データを取得します
resp = requests.get('https://api.cryptowat.ch/markets/gemini/btcusd/ohlc',
params={'periods': periods
})
data = resp.json()
# パンダデータフレームに変換
df = pd.DataFrame(
data['result'][periods],
columns=['CloseTime','OpenPrice','HighPrice','LowPrice','ClosePrice','Volume','NA'])
# DataFrameのヘッダー行を出力します
print(df.head())
# btc価格曲線をプロットする
df['ClosePrice'].plot(figsize=(14,7))
########### 出力###############
CloseTime OpenPrice HighPrice ... ClosePrice Volume NA
015588432008030.558046.30...8011.2011.64296893432.459964115588468008002.768050.33...8034.488.57568268870.145895215588504008031.618036.14...8000.0015.659680125384.519063315588540008000.008016.29...8001.4638.171420304342.048892415588576008002.698023.11...8009.243.58283028716.385009
コードを実行すると、次の図に示す曲線が得られます。
いくつかの独自のライブラリを使用できます。
さらに、定量的な取引フレームワークを構築せずにカスタムPython戦略を実行できる既存の便利な取引プラットフォームがいくつかあります。たとえば、Quantopianは、Ziplineに基づく標準のバックテスト環境を提供します。中国には、BigQuantやGuoren.comなどの同様のプラットフォームもあります。
また、Pythonはあらゆる分野で広く使われているプログラミング言語であり、投資機関の取引部門がPythonを使い始めているため、優れたPython開発者の需要が高まっています。当然、Pythonの習得はますます重要になっています。意味のある投資。
REST APIとは何ですか?RESTfulアーキテクチャを理解するための最良の方法は、Representational State Transferというフレーズの意味と、その各単語が表す意味を理解することです。完全な英語名から判断すると、状態の遷移を表します。URLを介してリソースを検索し、GET、POST、PUT、DELETEなどの動詞を使用して操作を記述します。この要件を満たすAPIは、RESTAPIと呼ばれます。
いくつか例を挙げてください。
1、 Gemini交換でのBTCからUSDへのティッカーインターフェイス:
GET https://api.gemini.com/v1/pubticker/btcusd
ここで、GETは動詞であり、背後のurlはティッカーリソースのアドレスであるため、これはRESTAPIインターフェイスです。
2、 以下は厳密なRESTAPIインターフェースではありません。
POST https://api.restful.cn/accounts/delete/:username
URIには「削除」(削除)という動詞が含まれているため、このURIはリソースを参照しません。厳密なRESTfulインターフェイスに変更する場合は、次のように変更できます。
DELETE https://api.rest.cn/accounts/:username
手動での注文は明らかに遅すぎて、定量的取引の本来の意図を満たしていません。コードを使用して注文を自動化する方法を見てみましょう。
最初のステップは、GeminiSandboxアカウントを登録することだけです。このテストアカウントでは、再請求は不要で、登録後に大量の仮想現金が送られますので、ご安心ください。このトーンはオンラインゲームのスローガンのように聞こえますか?次は「ブルームーンで私を見つけてください」です。ははは、でもこの設定は本当なので、急いで登録してください。
登録後、好奇心を満たすために、まずウェブインターフェースを使って自分で注文することができます。ただし、実際には、ロックを解除せずに通常どおり注文することは不可能であるため、この方法を試すことはあまり意味がありません。
したがって、2番目のステップでは、APIキーを構成する必要があります。 [ユーザー設定]、[API設定]、[新しいアカウントAPIキーの生成]の順にクリックし、キーとシークレットの2つの文字列を書き留めます。ウィンドウが消えると、これら2つのメッセージは見つからなくなり、再生成する必要があるためです。これで構成は完了です。次に、特定の実装について見ていきます。
定量的システムを開発するときは、明確なデータフロー図を念頭に置く必要があることを強調しておきます。注文ロジックは、Webページを操作し、リクエスト注文を作成し、リクエストを暗号化して、gemini Exchangeに送信するのと同じように、非常に単純なRESTfulプロセスです。
ただし、多くの知識ポイントが関係しているため、コードを最初から作成するために段階的に実行することは明らかに現実的ではありません。したがって、「読んでから覚えて使用する」という方法を採用して学習します。このコードは次のとおりです。
import requests
import json
import base64
import hmac
import hashlib
import datetime
import time
base_url ="https://api.sandbox.gemini.com"
endpoint ="/v1/order/new"
url = base_url + endpoint
gemini_api_key ="account-zmidXEwP72yLSSybXVvn"
gemini_api_secret ="375b97HfE7E4tL8YaP3SJ239Pky9".encode()
t = datetime.datetime.now()
payload_nonce =str(int(time.mktime(t.timetuple())*1000))
payload ={"request":"/v1/order/new","nonce": payload_nonce,"symbol":"btcusd","amount":"5","price":"3633.00","side":"buy","type":"exchange limit","options":["maker-or-cancel"]}
encoded_payload = json.dumps(payload).encode()
b64 = base64.b64encode(encoded_payload)
signature = hmac.new(gemini_api_secret, b64, hashlib.sha384).hexdigest()
request_headers ={'Content-Type':"text/plain",'Content-Length':"0",'X-GEMINI-APIKEY': gemini_api_key,'X-GEMINI-PAYLOAD': b64,'X-GEMINI-SIGNATURE': signature,'Cache-Control':"no-cache"}
response = requests.post(url,
data=None,
headers=request_headers)
new_order = response.json()print(new_order)
########## 出力##########
{' order_id':'239088767','id':'239088767','symbol':'btcusd','exchange':'gemini','avg_execution_price':'0.00','side':'buy','type':'exchange limit','timestamp':'1561956976','timestampms':1561956976535,'is_live': True,'is_cancelled': False,'is_hidden': False,'was_forced': False,'executed_amount':'0','remaining_amount':'5','options':['maker-or-cancel'],'price':'3633.00','original_amount':'5'}
RESTful POSTリクエストは、requests.postを介して実装されます。 Postは、url、data、headersの3つのパラメーターを受け入れます。ここでのURLはhttps://api.sandbox.gemini.com/v1/order/new。と同等ですが、コードには2つの部分で記述されています。最初の部分は交換APIアドレスであり、スラッシュで始まる2番目の部分は、統合されたAPIエンドポイントを示すために使用されます。他の取引所のAPIにも同様の記述が見られます.2つは互いに接続されて最終的なURLを形成します。
次の多数のコマンドの目的は、request_headersを作成することです。
また、ネットワーク通信において非常に重要で一般的な分野であるナンスにも注目してください。ネットワーク通信の信頼性が低いため、情報パケットが失われたり、繰り返し送信されたりする可能性があります。金融事業では、これらの両方が深刻な結果を引き起こす可能性があります。パケットが失われた場合は、再送信するだけですが、重複したパケットの場合は、重複を削除する必要があります。 TCPはある程度保証できますが、アプリケーションレベルでエラーが発生する可能性をさらに減らすために、GeminiExchangeではすべての通信ペイロードにnonceが必要です。
ナンスは単調に増加する整数です。後のリクエストのナンスが最後に正常に受信されたリクエストのヌース以下の場合、Geminiはリクエストを拒否します。このようにして、複製パッケージが2回実行されることはありません。一方、これにより、man-in-the-middle攻撃をある程度防ぐこともできます。
次のコードは非常に明確です。ペイロードに対してbase64およびsha384非対称暗号化を実行する必要があります。ここで、gemini_api_secretは秘密鍵です。取引所は、送信した要求を復号化できる公開鍵を格納します。最後に、コードは暗号化された要求をrequest_headersにカプセル化し、それを取引所に送信し、応答を受信すると、注文が完了します。
参考記事:
**Pythonコアテクノロジーと実際の戦闘:定量的な取引の実際の戦闘。 **これは私がPythonを学ぶことから最も学んだ場所であり、あなたにそれをお勧めします。以下のQRコードをスキャンして購入してください。
(終了)
Pythonテクノロジーの共有に焦点を当てる
購読、視聴、転送へようこそ