注釈

このページは docs/tutorials/11_time_series.ipynb から生成されました。

株式市場時系列データの読み込みと処理#

はじめに#

金融分野の多くの問題では、まず時系列から始まります。ここでは、疑似ランダム時系列を生成する方法、多くの一般的なプロバイダーから実際の株式市場の時系列をダウンロードする方法、そして時系列の類似度を計算する方法を紹介します。

[1]:
%matplotlib inline
from qiskit_finance import QiskitFinanceError
from qiskit_finance.data_providers import *
import datetime
import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters

register_matplotlib_converters()
[2]:
data = RandomDataProvider(
    tickers=["TICKER1", "TICKER2"],
    start=datetime.datetime(2016, 1, 1),
    end=datetime.datetime(2016, 1, 30),
    seed=1,
)
data.run()

データがロードされると、データを集約するために、さまざまなアルゴリズムを実行することができます。特に注目すべきは、共分散行列や、動的時間伸縮法 dynamic time warping (DTW) に基づく代替の時系列類似性測定を考慮した確率変数を計算することができます。DTWでは、例えば、ある銘柄の価格が別の銘柄の価格にわずかな遅れで追随するような、速度の変化に対応することができます。

[3]:
means = data.get_mean_vector()
print("Means:")
print(means)

rho = data.get_similarity_matrix()
print("A time-series similarity measure:")
print(rho)
plt.imshow(rho)
plt.show()

cov = data.get_covariance_matrix()
print("A covariance matrix:")
print(cov)
plt.imshow(cov)
plt.show()
Means:
[33.97683271 97.61130683]
A time-series similarity measure:
[[1.00000000e+00 5.41888011e-04]
 [5.41888011e-04 1.00000000e+00]]
../_images/tutorials_11_time_series_5_1.png
A covariance matrix:
[[2.08413157 0.20842107]
 [0.20842107 1.99542187]]
../_images/tutorials_11_time_series_5_3.png

ご希望であれば、元になる疑似ランダム時系列を調べることができます。なお、プライベートクラスのメンバー(アンダースコアで始まる)は、Qiskitの将来のリリースで変更される可能性があることに注意してください。

[4]:
print("The underlying evolution of stock prices:")
for (cnt, s) in enumerate(data._tickers):
    plt.plot(data._data[cnt], label=s)
plt.legend()
plt.xticks(rotation=90)
plt.show()

for (cnt, s) in enumerate(data._tickers):
    print(s)
    print(data._data[cnt])
The underlying evolution of stock prices:
../_images/tutorials_11_time_series_7_1.png
TICKER1
[33.345584192064784, 34.167202335565946, 34.49763941174933, 33.19448218014497, 34.099838046818086, 34.5462126191821, 34.009259383821814, 34.59037748801817, 34.95494988420424, 35.24908238085977, 35.27750462217556, 35.82421760878801, 35.08776352178634, 34.92485357379329, 34.442734261113316, 35.04158047374794, 35.0813025812296, 34.78884583026451, 34.00693736790767, 33.7497451272888, 33.757887307807145, 33.48228440250777, 34.77634821690598, 35.783072532211776, 33.07191005324581, 31.182896807278134, 31.008124715222973, 30.585934303646617, 30.799577301145227]
TICKER2
[96.8774156647853, 98.99525441983634, 97.88323365714406, 97.50562865001707, 99.5484002575094, 100.19510325371124, 100.85816662608751, 100.34416025440004, 98.69608508354439, 98.86354982776713, 98.97256391558868, 97.7452118613441, 97.06198519956354, 96.98994151983632, 96.04518989677554, 95.94691992892332, 96.04240295639278, 96.07798919344826, 95.57169753513395, 96.16544560691977, 97.0566125612021, 97.37746086576867, 96.55923063837835, 97.29088292216379, 96.78944290369674, 97.66860352198472, 96.59681610510728, 97.51128330823606, 97.49121985362058]

この場合、ティッカーの数と名前、日付の範囲を調整することができます。

[5]:
data = RandomDataProvider(
    tickers=["CompanyA", "CompanyB", "CompanyC"],
    start=datetime.datetime(2015, 1, 1),
    end=datetime.datetime(2016, 1, 30),
    seed=1,
)
data.run()
for (cnt, s) in enumerate(data._tickers):
    plt.plot(data._data[cnt], label=s)
plt.legend()
plt.xticks(rotation=90)
plt.show()
../_images/tutorials_11_time_series_9_0.png

終値の時系列へのアクセス#

リアルタイムデータへのアクセスには通常支払いが必要ですが、WikipediaとNasdaq Data Linkを経由して過去の(調整済みの)終値に無料でアクセスすることができます。 https://data.nasdaq.com/sign-up に登録が必要です。 以下のコードでは、実際のナスダック銘柄の実際のティッカーとNasdaq Data Linkから取得するアクセストークンを指定する必要があります; 以下のコードを実行することで、免責同意書を含むNasdaq Data Linkの利用規約に同意したことになります。共分散行列と時系列行列の計算には少なくとも2つのティッカーが必要ですが、数百のティッカーはNasdaq Data Linkの公正な使用制限を超えている可能性があることに注意してください。

[6]:
stocks = ["GOOG", "AAPL"]

token = "REPLACE-ME"
if token != "REPLACE-ME":
    try:
        wiki = WikipediaDataProvider(
            token=token,
            tickers=stocks,
            start=datetime.datetime(2016, 1, 1),
            end=datetime.datetime(2016, 1, 30),
        )
        wiki.run()
    except QiskitFinanceError as ex:
        print(ex)
        print("Error retrieving data.")

データがロードされると、共分散行列またはその DTW確率変数を再び計算できます。

[7]:
if token != "REPLACE-ME":
    if wiki._data:
        if wiki._n <= 1:
            print(
                "Not enough wiki data to plot covariance or time-series similarity. Please use at least two tickers."
            )
        else:
            rho = wiki.get_similarity_matrix()
            print("A time-series similarity measure:")
            print(rho)
            plt.imshow(rho)
            plt.show()

            cov = wiki.get_covariance_matrix()
            print("A covariance matrix:")
            print(cov)
            plt.imshow(cov)
            plt.show()
    else:
        print("No wiki data loaded.")

必要であれば、以下のような方法で時系列を調べることができます。

[8]:
if token != "REPLACE-ME":
    if wiki._data:
        print("The underlying evolution of stock prices:")
        for (cnt, s) in enumerate(stocks):
            plt.plot(wiki._data[cnt], label=s)
        plt.legend()
        plt.xticks(rotation=90)
        plt.show()

        for (cnt, s) in enumerate(stocks):
            print(s)
            print(wiki._data[cnt])
    else:
        print("No wiki data loaded.")

[Optional] 最近の細かい時系列にアクセスするためのセットアップトークン#

プロフェッショナル・データをダウンロードしたい場合は、主要プロバイダーの 1 つを使用してトークンをセットアップする必要があります。 ここでは、NASDAQとNYSEの銘柄について、任意の解像度で買値と売値、日次修正終値などの集計を供給できるNASDAQ Data on Demandを使ってデータを説明しましょう。

NASDAQ Data on Demandライセンスをお持ちでない場合は、NASDAQ (https://business.nasdaq.com/intel/GIS/Nasdaq-Data-on-Demand.html)に連絡して、トライアルライセンスまたは有料ライセンスを取得できます。

あなた自身のトークンを使用してNASDAQデータオンデマンドにアクセスできる場合は、以下のREPLACE-MEをトークンに置き換える必要があります。 接続のセキュリティを確保するには、NASDAQの証明書を検証する独自の手段を持っている必要があります。 DataOnDemandProviderのコンストラクタにはオプションの引数 verify があります。もし None を指定した場合は、証明書を使用します(デフォルト)。verifyが文字列の場合は、NASDAQ (dataondemand.nasdaq.com)へのHTTPS接続用の、CA_BUNDLEファイルの形式か、あるいはルックするディレクトリのいずれかの形式の証明書を指している必要があります。

[9]:
token = "REPLACE-ME"
if token != "REPLACE-ME":
    try:
        nasdaq = DataOnDemandProvider(
            token=token,
            tickers=["GOOG", "AAPL"],
            start=datetime.datetime(2016, 1, 1),
            end=datetime.datetime(2016, 1, 2),
        )
        nasdaq.run()
        for (cnt, s) in enumerate(nasdaq._tickers):
            plt.plot(nasdaq._data[cnt], label=s)
        plt.legend()
        plt.xticks(rotation=90)
        plt.show()
    except QiskitFinanceError as ex:
        print(ex)
        print("Error retrieving data.")

もう 1 つの主要な株式市場データのベンダーは、 Exchange Data International (EDI)であり、その API を利用して、既存の市場だけでなく、アフリカ、アジア、極東、ラテンアメリカ、中東など 100 を超える新興市場やフロンティア市場を照会することができます。 対象範囲の概要については、 https://www.exchange-data.com/ を参照してください。

このアクセスには、 REPLACE-ME を置き換えるための有効なアクセス・トークンが再度必要です。 このトークンは、試用版または有料で次のサイトから入手できます: https://data.nasdaq.com/sign-up

[10]:
token = "REPLACE-ME"
if token != "REPLACE-ME":
    try:
        lse = ExchangeDataProvider(
            token=token,
            tickers=["AEO", "ABBY", "ADIG", "ABF", "AEP", "AAL", "AGK", "AFN", "AAS", "AEFS"],
            stockmarket=StockMarket.LONDON,
            start=datetime.datetime(2018, 1, 1),
            end=datetime.datetime(2018, 12, 31),
        )
        lse.run()
        for (cnt, s) in enumerate(lse._tickers):
            plt.plot(lse._data[cnt], label=s)
        plt.legend()
        plt.xticks(rotation=90)
        plt.show()
    except QiskitFinanceError as ex:
        print(ex)
        print("Error retrieving data.")

Yahoo! ファイナンスからYahooファイナンスデータに、トークン無しで、アクセスすることもできます。

[11]:
try:
    data = YahooDataProvider(
        tickers=["MSFT", "AAPL", "GOOG"],
        start=datetime.datetime(2021, 1, 1),
        end=datetime.datetime(2021, 12, 31),
    )
    data.run()
    for (cnt, s) in enumerate(data._tickers):
        plt.plot(data._data[cnt], label=s)
    plt.legend(loc="upper center", bbox_to_anchor=(0.5, 1.1), ncol=3)
    plt.xticks(rotation=90)
    plt.show()
except QiskitFinanceError as ex:
    data = None
    print(ex)
../_images/tutorials_11_time_series_22_0.png

データの実際の使用については、portfolio_optimizationまたは portfolio_diversification ノートブックを参照してください。

[12]:
import qiskit.tools.jupyter

%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
qiskit-terra0.23.1
qiskit-aer0.11.2
qiskit-ibmq-provider0.20.0
qiskit0.41.0
qiskit-finance0.4.0
qiskit-optimization0.5.0
qiskit-machine-learning0.5.0
System information
Python version3.9.10
Python compilerClang 13.1.6 (clang-1316.0.21.2.5)
Python buildmain, Aug 9 2022 18:26:17
OSDarwin
CPUs10
Memory (Gb)64.0
Thu Feb 16 15:52:54 2023 JST

This code is a part of Qiskit

© Copyright IBM 2017, 2023.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

[ ]: