Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

RedisTimeSeriesで財務アプリケーションを構築する

大まかに言えば、世界には2つのタイプの投資家がいます。 基本的な投資家 s企業に投資するかどうかを決定する際には、企業のビジネスモデル、収益、収益、キャッシュフロー、現在の評価、リスク、成長見通しなどの基本的な指標を確認します。ウォーレンバフェットは、彼の基礎研究を通じて過小評価されている企業を見つけることで有名になり、世界で最も裕福な男性の1人になりました。

一方、技術投資家 会社のファンダメンタルズにはほとんど、またはまったく注意を払わず、代わりに、何百ものテクニカル指標からシグナルを購入、販売、保持することに注意を向けます。これらのテクニカル投資家は、日次、週次、または月次で取引されます。

私は、これらの投資スタイルのいずれかに賛成または反対するためにここにいるわけではありません。しかし、ファンダメンタル投資家とテクニカル投資家の両方が、数千とは言わないまでも数百のデータソースに基づいて調査、分析、および意思決定を行います。

基本的な投資家は、世界中の何千もの企業と何百もの業界にわたる貸借対照表、損益計算書、キャッシュフロー計算書、人口統計学的傾向、主題的傾向、および社会的傾向を研究します。彼らはそのデータに基づいて財務モデルまたは分析を構築し、企業の軌跡と企業の成長見通しをよりよく理解します。

テクニカル投資家は、投資シグナルを導き出すために、1時間ごとまたは1日ごとに何百ものテクニカル指標を調べます。テクニカル指標に依存する投資家は、取引戦略を構築するために、複数の時間枠にわたる膨大な数のデータを処理する必要があります。彼らは膨大な数の指標を照会する必要があり、事実上即座の回答を必要とするかもしれません。彼らは、急速に変化する市場にアルゴリズムと取引戦略を迅速に適応させる必要があるかもしれません。 Redis Enterpriseは、これらすべての課題に対処できます。

最近、RedisEnterpriseが金融業界にとって不可欠なツールである理由について書きました。このブログ投稿では、RedisTimeSeriesを使用して、株価とテクニカルインジケーターを保存、集計、およびクエリする方法を紹介します。ここで概説する原則は、企業からの財務情報や、ファンダメンタル投資家が使用するその他の時系列データを保存および照会するためにも使用できます。

RedisTimeSeriesモジュールは、数百万のイベント、サンプル、および価格データを取り込んで照会できます。 RedisTimeSeriesは、関連する時間と値のペアを保存して、IoTからヘルスケア、金融に至るまでのユースケースの傾向を特定するのに最適です。 RedisTimeSeriesは、平均、合計、最小、最大、標準偏差、範囲などの集計を提供し、データを簡単に分析して決定を下すのに役立ちます。

RedisTimeSeriesを使用した株価の追跡

この投稿では、RedisTimeSeriesを使用して株価とテクニカル指標を保存するためのモデルを説明します。価格とインジケーターのさまざまな時系列の作成について説明し、生の時系列の上に集計を作成する方法を示し、さまざまなRedisTimeSeriesコマンドを使用してバルク時系列を簡単に取り込み、照会できることを示します。また、Pythonでサンプルコードを提供しました。これは、独自のユースケースの開始点として使用できます。

正しいか間違っているかを問わず、多くの人がダウ工業株30種平均(DJIA)を米国経済の先駆けと考えています。 DJIAの30銘柄すべてのテクニカル指標を、株価と取引量とともに追跡したいと思います。ダウコンポーネントのゴールドマンサックスの株価とその株式のテクニカル指標の1つを追跡することから始めます。私のお気に入りの技術指標の1つは、相対力指数(RSI)です。 RSIは、買われ過ぎまたは売られ過ぎの領域にある可能性のある株式を測定するために使用される勢いの指標です。 RSIが30付近またはそれ以下に移動すると、株式は売られ過ぎと見なされ、買いの機会をもたらす可能性があります。同様に、RSIが70を超えると、買われ過ぎの領域に入り、売りの良い時期を示している可能性があります。

ゴールドマンサックスグループの相対力指数

RedisTimeSeriesで財務アプリケーションを構築する

取引時間中、RSIは、他のテクニカル指標と同様に、ゴールドマンサックスの株式の需要と供給に基づいて取引が実行されるときに変化します。 RedisTimeSeriesモジュールを使用して、いくつかの重要な質問に答えることができます。

  • 指定された各時間間隔のテクニカルインジケーターの最小値と最大値はいくつですか。
    • これにより、取引の入口または出口をすばやく見つけることができます。
  • 指定された時間間隔での株価の範囲と標準偏差はどのくらいですか?
    • 範囲と標準偏差は、原資産の株価のボラティリティの指標です。
  • この株の取引で収益性の高いエントリー価格とエグジット価格はどれくらいですか?
  • 指定された時間間隔でのすべての株式のテクニカル指標の値は何ですか?

RedisTimeSeriesクエリを使用して、指定された期間の最小および最大RSI値と株価をプログラムで識別できます。たとえば、取引日の15分間ごとに最小および最大RSI値を見つけたい場合はどうなりますか? RSIが30または30に近い場合、アラートを生成したり、取引を行ったり、別の複雑な取引ワークフローを開始して、売買する前に他のテクニカル指標を分析したりすることができます。やりたいことはすべて、RedisTimeSeriesデータベースで簡単にモデル化できます。

株価とテクニカル指標のデータモデル

RedisTimeSeriesを実際に体験する最も簡単な方法は、RedisTimeSeriesのDockerイメージを実行することです。

次のコマンドを実行して、Dockerイメージをプルして実行します。

 docker run -p 6379:6379 -it --rm redis / redistimeseries 

Redisチームは、RedisTimeSeriesモジュールが各時系列で単一のメトリックを保持するように意図的に設計を決定しました。データモデルのこの単純さにより、データの挿入と取得が非常に高速になります。既存のアプリケーションを壊すことを心配せずに、必要に応じて新しい時系列を追加できます。つまり、データベーススキーマやアプリケーションを壊すことを心配することなく、新しいデータソースを簡単に追加できます。

RedisTimeSeriesコンテナを起動して実行すると、次のようにPythonを使用してサーバーに接続できます(正しいIPアドレスまたはホスト名があることを確認してください)。

 from redistimeseries.client import Client rts =Client(host ='127.0.0.1'、port =6379)

各時系列で単一のメトリックを保持するという設計原則により、各DJIA株式の日中株価とRSIを独自の時系列で保存できます。以下に、Goldman Sachs Group、Inc.(NYSE:GS)の時系列を作成しました。 ゴールドマンサックスの日中RSIに「DAILYRSI:GS」という名前を付けました また、各時系列にさまざまなラベルを適用しました。時系列にラベルを付けると、ラベルを使用してすべてのキーをクエリできます。

rts.create('DAILYRSI:GS',             labels={ 'SYMBOL':'GS'                   , 'DESC':'RELATIVE_STRENGTH_INDEX'                   , 'INDEX' :'DJIA'                   , 'TIMEFRAME':'1_DAY'                   , 'INDICATOR ':' RSI'、' COMPANYNAME':' GOLDMAN_SACHS_GROUP'})

ここでは、ゴールドマンサックスの日中株価の時系列を「INTRADAYPRICES:GS」と呼びます。 :

rts.create('INTRADAYPRICES:GS',             labels={ 'SYMBOL':'GS'                   , 'DESC':'SHARE_PRICE'                   , 'INDEX' :'DJIA'                   , 'PRICETYPE':'INTRADAY'                   , 'COMPANYNAME ':' GOLDMAN_SACHS_GROUP'})

次に、特定の15分の時間枠内でRSIデータにさまざまな集計を作成しました。 (取引のニーズに合わせて、より長いまたはより短い時間枠で集計を作成することもできます。)これらの集計により、RSIの最初、最後、最小、最大、および範囲の値を確認できます。集計を作成するには、最初に集計を格納する時系列を作成し、次に集計値を時系列に入力するルールを作成します。この場合、「DAILYRSI15MINRNG:GS」という時系列を作成しました。 15分の期間内にRSIの範囲を保存します。 「createrule」 生データに範囲関数を適用します(「DAILYRSI:GS」 )15分の時間枠ごとに、それを「DAILYRSI15MINRNG:GS」に集約します。 。

rts.create('DAILYRSI15MINRNG:GS',             labels={ 'SYMBOL':'GS'                    , 'DESC':'RELATIVE_STRENGTH_INDEX'                    , 'INDEX' :'DJIA'                    , 'TIMEFRAME':'15_MINUTES'                    , 'AGGREGATION ':' RANGE'、' INDICATOR':' RSI'、' COMPANYNAME':' GOLDMAN_SACHS_GROUP'})rts.createrule(' DAILYRSI:GS'、' 

ここでは、取引日の15分間隔ごとにゴールドマンサックスの株価の範囲と標準偏差を計算するためのルールをいくつか作成しました。

rts.create('INTRADAYPRICES15MINRNG:GS'          , labels={ 'SYMBOL':'GS'                   , 'DESC':'SHARE_PRICE'                   , 'INDEX' :'DJIA'                   , 'PRICETYPE':'RANGE'                   , 'AGGREGATION ':'RANGE'                   , 'DURATION':'15_MINUTES'                   , 'COMPANYNAME':'GOLDMAN_SACHS_GROUP'})rts.createrule('INTRADAYPRICES:GS'              ,'INTRADAYPRICES15MINRNG:GS'              ,'range', 900)rts.create(' INTRADAYPRICES15MINSTDP:GS'          , labels={ 'SYMBOL':'GS'                   , 'DESC':'SHARE_PRICE'                   , 'INDEX' :'DJIA'                   , 'PRICETYPE':'STDDEV'                   , 'AGGREGATION':'STDDEV'                   , 'DURATION ':' 15_MINUTES'、' COMPANYNAME':' GOLDMAN_SACHS_GROUP'})rts.createrule(' INTRADAYPRICES:GS'900' p'>'、' 

同様の方法で、ダウジョーンズ工業株30種平均(DJIA)の30銘柄すべての時系列を作成できます。

データの取り込み方法

データをRedisTimeSeriesに取り込むには2つの方法があります。 TS.ADD コマンドを使用すると、各株価またはテクニカル指標を時系列に追加できます。ただし、金融市場からのデータはほぼ継続的に生成され、RedisTimeSeriesに複数のサンプルを追加する必要があるため、 TS.MADDを使用することをお勧めします。 方法。 MADD関数は、タプルのリストを引数として取ります。各タプルは、時系列キーの名前、タイムスタンプ、および値を取ります:

RedisTimeSeriesで財務アプリケーションを構築する

次のPythonコマンドを使用して、時系列キーにデータを挿入できます。

 rts.madd(

RedisTimeSeriesのクエリ

RedisTimeSeriesのほとんどのものと同様に、データベースのクエリは簡単です。株価またはテクニカル指標の範囲と標準偏差は、ボラティリティの指標です。次のクエリでは、15分間隔ごとのゴールドマンサックスの株価の価格範囲と標準偏差を確認できます。

 rts.range('INTRADAYPRICES15MINRNG:GS'、from_time =1603704600、to_time =1603713600)

この範囲集計のクエリにより、次の結果セットが得られます。

 [(1603704600、1.75999999999999)、(1603705500、0.775000000000006)、(1603706400、0.730000000000018)、(1603707300、0.449999999999989)、(1603708200、0.370000000000005)、(1603709100、1.01000000000002)、(1603710000、0.490000000000009)、(1603710900 )、(1603711800、0.629999999999995)、(1603712700、0.490000000000009)、(1603713600、0.27000000000001)] 

このクエリ結果が示すように、2020年10月26日の午前9時30分の取引日の開始時(整数タイムスタンプ=1603704600)、ゴールドマンサックスの株価は変動し、1.75ドルの範囲で取引されていました。ここで、これを10月26日の午前9時45分から始まる次の15分(整数のタイムスタンプ=1603705500)と比較します。ここでは、ボラティリティが$0.77の範囲で低下しました。ゴールドマンサックス株の価格帯はその後の15分間隔で下落し続け、ボラティリティは最初の15分間隔で到達したレベルに戻ることはありませんでした。

RedisTimeSeriesからのこのデータは、ダッシュボードやチャートで簡単に視覚化できます。下のグラフは、ゴールドマンサックスの価格帯を15分間隔で示しています。

RedisTimeSeriesで財務アプリケーションを構築する

以下のチャートは、同じデータを折れ線グラフ形式で示しています。これは、ゴールドマンサックスが取引する価格範囲が、時間の経過とともに非常に厳しくなることを示しています(このチャートはx軸に整数のタイムスタンプを示しています):

RedisTimeSeriesで財務アプリケーションを構築する

集計関数として、ボラティリティの別の測定値(標準偏差)を使用して同様のクエリを実行できます。

 rts.range('INTRADAYPRICES15MINSTDP:GS'、from_time =1603704600、to_time =1603713600)
 [(1603704600、0.54657783830434)、(1603705500、0.23201149395202)、(1603706400、0.196072381345986)、(1603707300、0.160267138157647)、(1603708200、0.116990621700049)、(1603709100、0.28043101744222)、(1603710000、0.144300122) )、(1603711800、0.163118915546951)、(1603712700、0.151417199675549)、(1603713600、0.0963889432843203)] 

これにより、多くの興味深い可能性が開かれます。日中のRSI値が30〜40の場合のゴールドマンサックスの株価を知りたいとします。RSIの時系列と株価の時系列をクエリして、取引の収益性の高いエントリポイントを特定できます。

ここでは、1605260100(2020年11月13日の午前9時35分ET)から1605260940(その日の午前9時49分ET)までの時間枠でゴールドマンサックスのRSI値をクエリしています。

 dailyGSRSIValue =rts.range('DAILYRSI:GS'、from_time =1605260100> 605> 960)=1 

クエリは、RSI値が1605260820(9:47 a.m. ET)で34.2996427544861であったことを検出します。

 [(1605260100、75.0305441024708)、(1605260160、81.6673948350152)、(1605260220、83.8852225932517)、(1605260280、85.9469082344746)、(1605260340、94.3803586011592)、(1605260400、92.2412262502652)、(1605260 )、(1605260580、89.9407873066781)、(1605260640、57.1512452602676)、(1605260700、50.5638232111769)、(1605260760、35.2804436894564)、(1605260820、34.2996427544861)、(1605260880、54.5486275202972)、(1605260940、64。 

これで、RSIクエリに使用された間隔と同じ間隔でゴールドマンサックスの日中価格をクエリしたり、RSI値が34.29であった時期を反映するようにクエリをプログラムで変更したりできます。これは、RSIクエリと同じ時間枠を使用した例です。

 dailyGSPrice =rts.range('INTRADAYPRICES:GS'、from_time =1605260100 pre>、to_time 
 クエリは、指定された範囲のゴールドマンサックスの株価を返します。1605260820(2020年11月13日の午前9時47分ET)の価格は217.18ドルでした。 

 [(1605260100、216.57)、(1605260160、216.73)、(1605260220、217.08)、(1605260280、217.17)、(1605260340、217.87)、(1605260400、218.05)、(1605260460、217.91)、(1605260520、218.0 )、(1605260580、218.11)、(1605260640、218.02)、(1605260700、217.72)、(1605260760、217.22)、(1605260820、217.18)、(1605260880、217.46)、(1605260940、217.61)] 

RedisTimeSeriesは、一度に複数の時系列にわたってクエリを実行するための強力な方法を提供します。 TS.MGET コマンドを使用すると、フィルターを使用して複数の時系列にわたってクエリを実行できます。すでにさまざまな時系列を作成し、それらにラベルを付けています。これらのラベルは、時系列全体でクエリを実行するためのフィルターとして機能できるようになりました。

次のPythonコードは、「DESC」と「TIMEFRAME」という2つのラベルに基づいて2つのフィルターを適用します。パラメータ“ with_labels =False” 各値のラベルなしで結果セットを返すことができます:

 allRSIValues =rts.mget(filters =['DESC =RELATIVE_STRENGTH_INDEX'、'TIMEFRAME =1_DAY']、with_labels =False)

このクエリは、ここに示されているものと同様の結果を表示します。これは、複数の株式の最後のRSI値を返します。

 [{'DAILYRSI:BA':[{}、1605261060、62.2048922111768]}、{'DAILYRSI:CAT':[{}、1605261060、68.3834400302296]}、{'DAILYRSI:CRM':[{}、1605261060 、59.2107333830133]}、{'DAILYRSI:CSCO':[{}、1605261060、52.7011052724688]}、{'DAILYRSI:CVX':[{}、1605261060、62.9890368832232]}、{'DAILYRSI:DOW':[{}、 1605261060、73.597680480764]}、{'DAILYRSI:GS':[{}、1605283140、41.182852552541]}、{'DAILYRSI:IBM':[{}、1605261060、65.3742140862697]}、{'DAILYRSI:JPM':[{} 、1605261060、77.7760292843745]}、{'DAILYRSI:KO':[{}、1605261060、26.8638381005608]}、{'DAILYRSI:MMM':[{}、1605261060、65.7852833683174]}、{'DAILYRSI:MRK':[{ }、1605261060、38.9991886598036]}、{'DAILYRSI:UNH':[{}、1605261060、74.2672428885775]}、{'DAILYRSI:VZ':[{}、1605261060、33.177554436462]}、{'DAILYRSI:WBA':[ {}、1605261060、47.3877762365391]}] 

“ with_labels =True”を設定した場合 、次に示すように、結果には各時系列のすべてのラベルが含まれます。

 [{'DAILYRSI:BA':[{'SYMBOL':'BA'、'DESC':'RELATIVE_STRENGTH_INDEX'、'INDEX':'DJIA'、'TIMEFRAME': '1_DAY'、'INDICATOR': ' RSI'、' COMPANYNAME':' BOEING'}、1605261060、62.2048922111768]}、{' DAILYRSI:CAT':[{' SYMBOL':' CAT'、' DESC':' RELATIVE_STRENGTH_INDEX'、' INDEX':' DJIA ' 、'TIMEFRAME': '1_DAY'、'INDICATOR':'RSI'、'COMPANYNAME':'CATERPILLAR'}、1605261060、68.3834400302296]}、{'DAILYRSI:CRM':[{'SYMBOL':'CRM'、 ' DESC':' RELATIVE_STRENGTH_INDEX'、' INDEX':' DJIA'、' TIMEFRAME':' 1_DAY'、' INDICATOR':' RSI'、' COMPANYNAME':' SALESFORCE'}、1605261060、59.2107333830133]}] 

結論

このブログ投稿では、時系列データに依存する金融アプリケーションを柔軟に構築するためのRedisTimeSeriesの多くのコマンドの一部を紹介しています。たとえば、株式トレーダーは、数十の変数に基づいて、リアルタイムでハイステークスの意思決定を行うことができる必要があります。 RedisTimeSeriesはスキーマレスです。つまり、スキーマを定義せずにデータをロードしたり、その場で新しいフィールドを追加したり、ビジネス状況が変化した場合にデータモデルを変更したりできます。リアルタイムのパフォーマンスとシンプルな開発者エクスペリエンスにより、時系列データを操作するのが楽しくなります!

このブログ投稿のサンプルコードは、GitHubのここにあります。また、RedisTimeSeriesの詳細についてはこちらをご覧ください。


  1. RedisTimeSeries 1.6がリリースされました!

    本日、RedisTimeSeries1.6の一般提供を発表できることをうれしく思います。このブログ投稿では、現在利用可能な主な新機能について詳しく説明しています。 RedisTimeSeriesについて RedisTimeSeriesは、Redis用の高性能でメモリファーストの時系列データ構造です。 RedisTimeSeriesは、時系列マルチテナンシー(多数の時系列を同時に保持できます)をサポートし、これらの時系列に同時にアクセスする複数のクライアントにサービスを提供できます。 Redisスタックの一部としても利用できるようになりました。 RedisTimeSeries1.6の主な新機能

  2. PC で iOS アプリを実行する方法

    この記事では、PC で iOS アプリを実行する方法について説明します。すべての iPhone は高価であり、ほとんどの iPhone を購入する余裕がないことを知っている必要があります。 iPhone には、誰もが使いたくなる最高のアプリケーションがいくつか用意されています。 iPhoneは高いからといって、体験できない人がほとんどです。しかし今では、iPhone を購入しなくても、誰もがこれらのアプリを体験できます。どうすればできますか? iOS アプリケーションを使用するには、PC にエミュレータ アプリケーションが必要です。したがって、エミュレーターは、PC で iOS アプリを体験す