Market Data APIを使用した30分の金融電報ボット

通常、フィンテックに関する記事は、交換の仕組み、膨大な量のデータを途方もない速度で処理する方法、巧妙なトレーダーとクォンタムが洗練されたアルゴリズムを使用して数十億ドルを稼ぐ(または失う、時にはすべて)方法、またはブロックチェーンの動作について書いています複雑な数学的計算によって提供されます。 これらはすべて、フィンテック開発への参入レベルが非常に高いという印象を与えます。 そして、一部は真実です-負荷の高い金融アプリケーションの開発者の要件は厳格かつ具体的です。



しかし、誰もが小さく始めたので、関心のある人なら誰でも金融部門でアプリケーションを作成できると信じています。 30分でユーザーに役立つ独自の小さなアプリケーションを開発してみましょう。







ユーザー対話するための最新の技術レビューから、自然言語でリクエストを理解するあらゆる種類のボットやヘルパーが急速に人気を得ていることがわかります。 この傾向をサポートし、リクエストに応じてユーザーに市場について何かを伝えることができるシンプルなテレグラムボットを作成します。



データアクセス



簡単な状況から始めましょう。アプリケーションは、オークションの現在および過去のデータを使用し、独自のアプリケーションを取引所に送信しません。 これらのデータ(いわゆる市場データ 、または株式情報)は、比較的少ない料金で、または無料で、多くの企業から取得できます。 アプリケーションの送信では、すべてが著しく複雑になります(少なくとも-より高価です)。このプロセスについては、以下の記事で詳しく検討します。



株式データを取得するための技術は何ですか? リストは大きすぎません: FIXプロトコル (実装はプロバイダーによってわずかに異なる場合があります)、 FAST 、ITCH、およびいくつかのバイナリーおよびHTTP APIオプション(CQG、EXANTE、MOEXなど)です。 ただし、ここでの普遍化はそれほど基本的ではありません。提供されるデータのセットは大きく異なる可能性があり、いずれにしても、統合は特定のプロバイダーの詳細に対処する必要があります。









最近登場したEXANTE Market Data APIを使用します 。開発を簡単かつ迅速に開始でき、システムへの登録には追加の確認は不要で、データへのアクセスは無料です。 APIはTech Previewモードで動作しますが、アクセスはすべてのユーザーに公開されています。



機能性



可能性の範囲を定義したら、チャットボットの動作を正確に決定する必要があります。 多くのオプションがあります:為替レートの表示から、特定の為替商品のリクエストに応じた取引戦略の分析まで。 これまでのところ、金融アルゴリズムの詳細を掘り下げて有用なことをしようとするつもりはありませんが、同時に非常に簡単です。



最も理解しやすい金融商品の1つは、証券取引所で取引されている企業の株式です。 基本的なデータを取得するのが最も簡単であり、そこで取引が最も活発であるため、単純化のために米国の株式市場を選択し、彼らと協力します。



初心者の投資家は何に興味がありますか? もちろん、株のポートフォリオの選択は、彼が利益を上げることができるようになるために投資することによって。 株式を選択するには多くの方法があります。レビューを読んだり、 ウォーレンバフェットビルエクマンのような最高の投資家のポートフォリオに集中したり、分析的な方法を使用したりできます。 一般的に受け入れられ、最も一般的な方法の1つは、P / Eメトリック( 価格/収益率 )を使用して会社を評価することです。 P / Eは、会社の現在の株価と1株当たり利益(EPS、1株当たり利益)の比率として計算されます。



したがって、チャットボットは、価格/収益率の現在の評価に基づいて、投資家がポートフォリオに米国株式市場の特定の会社の株式を含めるかどうかを決定するのに役立ちます。 この業界の他の企業に比べて高いP / Eは、株式が上昇する可能性があることを示します。 逆に、低いと、将来、会社が問題に直面する可能性があることが明らかになります。



建築



したがって、交換情報の主なソースとして、EXANTE Market Data API(MD API)を選択します。 基本的な情報(会社の財務の一般的な状態に関する情報)を取得するには、YQL(Yahoo! Query Language)で作業できるオープンなdatatables.orgデータソースを使用します。



ボット自体を実装するには、Python 3を使用し、できるだけ早く実行するために、必要なすべてのTelegramメソッドをサポートするフレームワークpython-telegram-botを適用します。



Telegramを使用するには、サーバーからの新しいメッセージのポーリングを使用します。これは、プロトタイプでは大量のトラフィックに依存しないためです。



アプリケーションは1つのクライアントだけでなく動作する可能性があることを事前に考えてみましょう。 これを行うには、リクエストを個別のスレッドで処理します。 スレッドを同期して開始するには、python-telegram-botフレームワークの組み込み機能とPythonで使用可能な同期プリミティブを使用します。



選択したすべての外部サービスはHTTP経由でアクセスできるため、よく知られているRequestsモジュールを使用してそれらを処理します。



確かに、多くの投資家は非常に人気のある同じ株に興味があるので、リソースをより有効に活用するためにキャッシングのレイヤーを追加します。



MD APIでは、 PyJWTライブラリを使用するトークンの生成のために、 JSON Web Tokenを使用したリクエストの承認が必要です。



API接続



MD APIの使用を開始するには、開発者向けにEXANTE Webサイトに登録する必要があります。



ポータルに登録すると、アクセスおよびアプリケーション管理用のデータを含むダッシュボードが利用可能になります。 ボット用のアプリケーションを作成しましょう:







BotFatherロボットとの通信を通じて、Telegramのドキュメントで説明されているようにボット自体を開始します











実装



まず、受信したリクエストを処理するようボットに教えます。 ダイアログが次のようになるように、各メッセージから株価ティッカーを選択し、それらに関する情報を発行しようとします。



-こんにちは、ロボット、今日ニュースでAAPLについて聞いたのですが、これはある種の果物会社のようです。そこにお金を投資したいと思います。

-AAPL株式(Apple Inc、NASDAQ)の現在の評価はP / E 14、株価は117.06ドル

-ありがとう、NVDAとGOOGはどうですか?

-NVDA(Nvidia Corp.、NASDAQ):P / E 69、価格$ 105.7

GOOG(Alphabet Inc.、NASDAQ):P / E 29、価格$ 796.42



ボットを初期化し、メッセージハンドラーを作成します。



# -*- coding:utf-8 -*- import re from sys import path from configparser import ConfigParser from telegram import ParseMode, Emoji from telegram.ext import Updater, CommandHandler, MessageHandler, Filters config = ConfigParser() config.read_file(open('config.ini')) # Create telegram poller with token from settings up = Updater(token=config['Api']['token']) dispatcher = up.dispatcher # Welcome message def start(bot, update): msg = "Hello {user_name}! I'm {bot_name}. Ask me about stocks!" # Send the message bot.send_message(chat_id=update.message.chat_id, text=msg.format( user_name=update.message.from_user.first_name, bot_name=bot.name)) def process(bot, update): msg = "I will try to show info on {tickers}" tickers = re.findall(r'[AZ]{1,4}', update.message.text) bot.send_message(chat_id=update.message.chat_id, text=msg.format(tickers=", ".join(tickers))) def main(): # Add handlers to dispatcher dispatcher.add_handler(CommandHandler("start", start)) dispatcher.add_handler(MessageHandler(Filters.text, process)) # Start the program up.start_polling() up.idle() if __name__ == '__main__': main()
      
      





これで、ボットは既に株式ティッカーを割り当てることができますが、それ以上のことはできません。



Market Data APIと連携してトークンを生成するためのインターフェースを作成します。 ドキュメント承認ガイドを使用します



 import jwt # token expiration time in seconds EXPIRATION = 3600 class MDApiConnector(): token = (None, None) algo = "HS256" def __init__(self, client_id, app_id, key): self.client_id = client_id self.app_id = app_id self.key = key def __get_token(self): now = datetime.now() # if there is token and it's not expired yet if self.token[0] and (now - self.token[1]).total_seconds() < EXPIRATION: return self.token[0] claims = { "iss": self.client_id, "sub": self.app_id, "aud": ["symbols", "ohlc"], # NB: only allowed scopes can be accessed "iat": int(now.timestamp()), "exp": int(now.timestamp()) + EXPIRATION } new_token = str(jwt.encode(claims, self.key, self.algo), 'utf-8') self.token = (new_token, now) return new_token
      
      





すべてのモジュールの完全なコードは、リポジトリで入手できます: github.com/exante/telegram-bot-with-md-api



株式のバルクデータを定期的に要求する別のストリームを追加します。



 class DataStorage(Thread): def __init__(self, connector): super().__init__() self.connector = connector self.stocks = {} def run(self): while True: timeout = 15 * 60 # 15 minutes try: self.stocks = connector.get_stocks() except Exception as e: logger.error(e) timeout = 30 # re-read in case of exception time.sleep(timeout)
      
      





APIを使用して米国株式のリストを取得する方法は次のようになります。



 def get_stocks(self): stocks = self.__request("/types/STOCK") return {x['ticker']: {"id": x["id"], "exchange": x["exchange"], "description": x["description"]} for x in stocks if x.get("country") == "US"}
      
      





このスレッドを開始し、メッセージハンドラーからアクセスすると、ボットはより有用なデータを出力できるようになります(P / Eは依然としてスタブです)。









Earning Per Shareリクエストを追加します。これにより、キャッシュを使用してYQLの小さなラッパーを作成し(近い将来、この呼び出しをMD APIからの類似の呼び出しに置き換えることができます)、選択した株式の値「EarningsShare」を要求します。



結果のEPS図を印刷できます。









最後に残っているのは、現在の株価を取得することです。 パフォーマンスを向上させるには、価格の更新ストリームを購読する必要がありますが、プロトタイプの場合は、より簡単な方法を選択できます。最後の毎日の「キャンドル」をリクエストします。これはトレーダーの間で人気の価格チャートの要素の名前です









年ごとのDJIインデックスと金の価格の比率のローソク足チャートの例



「キャンドル」は特定の期間(たとえば、1日または1時間)に作成され、1つの図では、4つの数値を組み合わせます:期間の開始時の価格、期間の最大および最小価格、期間の終了時の価格。 そのようなろうそくを示す略語OHLCは、Open-High-Low-Closeの略です。 最新のローソク足の終値は、現在の株価に対応します。



最後のキャンドルを取得する方法は次のようになります。



  def get_last_ohlc_bar(self, symbolId): # NB: we use internal symbolId, not ticker # 86400 (sec) - day duration ohlc = self.__request("/ohlc/%s/86400" % symbolId, {"size": 1}) return ohlc[0]
      
      





すべての呼び出しをまとめて、1ティッカーを処理するための次のコードを取得します。



  stock = storage.stocks.get(ticker) eps = fundamendal_api.request(ticker).get('EarningsShare') price = api.get_last_ohlc_bar(stock['id']) ratio = Decimal("%.4f" % price['close']) / Decimal(eps) msg = "{ticker} ({name}, {exchange}): EPS {eps}, P/E {ratio},  ${price} \n".format( ticker = ticker, name = stock['description'], exchange = stock['exchange'], ratio = "%.2f" % ratio, price = price['close'], eps = eps )
      
      





そして今、ボットは本当に便利になりました! 彼は株式市場の現在の状況について話すことができ、何かアドバイスすることさえできます。











プロジェクト開発



現在のプロジェクトはgithub.com/exante/telegram-bot-with-md-apiで見つけることができます



多くの分野でさらなる開発が可能です。 たとえば、MD API( /md/1.0/feed



)からの現在の株価に関するデータストリームを使用し、「キャンドル」から毎回価格を要求するのではなく、ストリームが更新されたときに移動する内部キャッシュから取得することができます。



ボットに監視と分析を追加し(たとえば、 botan.ioを介して)、HerokuやGoogle App Engineなどのクラウドホスティングにデプロイすることもできます。



より多くの回答オプションを追加し、投資家に分析のためにさらに多くの情報を提供するために価格変更チャートを表示することを教えることにより、ボットをより「生き生き」させることができます。 株式を評価するためのその他のメトリックを追加し、ポートフォリオをロボットデータに保存して、投資家にすべての変更を通知し、たとえばロシアの株式市場に機能を拡張できます。



おわりに



EXANTE Market Data APIを接続し、オープンな基本情報を使用することにより、短時間でユーザーが市場の状況を迅速に評価できるようにする機能的なロボットを開発しました。 その過程で、市場の株式を評価するいくつかの方法と、株式取引で使用される用語について学びました。



また、開発の可能性を検討しましたが、このような小さなロボットでも多くの可能性があります。 市場データを使用する方法は他にもたくさんあります。また、金融アプリケーションに興味を持っている多くのユーザーがいます。



2月、EXANTEはEXANTE Market Data APIを使用して市場データを操作するためのハッカソンを開催します。 最高のチャットボットとアプリケーションの作成者が賞品を受け取ります。準備が整いました:)イベントについては後ほど詳しく説明します。



どのAPIを使用していますか? 市場データで何をしたいですか?



All Articles