logo

CYBOS Plusで証券の株価を取得する方法 CpSysDib.StockChart 📂データ確保

CYBOS Plusで証券の株価を取得する方法 CpSysDib.StockChart

ガイド 1

CpSysDib.StockChartは、株式、業種、ELWのチャートデータを受信する。APIの使用に慣れていない場合、このシステムを理解するのは非常に難しいかもしれない。Seegene株式会社の株価を取得するPythonの例を実行して、その動作を把握してみよう。

  • SetInputValue(): 何のデータを欲しいかを具体的に指定する。
  • BlockRequest(): 指定されたデータの受信を要求する。
  • GetHeaderValue(): 受信したヘッダーデータを返す。
  • GetDataValue(): 受信したデータを返す。

このように変わった関数を変に使う理由は、CYBOS Plusが特にPythonライブラリではないからだ。説明で詳しく扱う。

ハイライト

>>> days = 10
>>> instStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
>>> instStockChart.SetInputValue(0, seegene)
>>> instStockChart.SetInputValue(1, ord('2'))
>>> instStockChart.SetInputValue(4, days)
>>> instStockChart.SetInputValue(5, 5)
>>> instStockChart.SetInputValue(6, ord('D'))
>>> instStockChart.SetInputValue(9, ord('1'))
>>> instStockChart.BlockRequest()
0
>>> numData = instStockChart.GetHeaderValue(3)
>>> for i in range(numData):
...     print(instStockChart.GetDataValue(0, i), end = ', ')
...
80700, 80100, 77400, 77200, 82600, 85800, 83800, 88000, 88000, 90500, >>>

20210721_100212.png

2021年7月21日午前10時頃に、株価データがうまく取得できたことが確認できる。

説明

instStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
instStockChart.SetInputValue(0, 'A096530')

前述したように、CYBOS Plusは特にPythonのためだけに開発されていない。WindowsシステムCOM Objectライブラリを使える開発環境であればどこでも使用でき、ビジュアルスタジオやPython、MSオフィスでも使用される。オブジェクトinstStockChartは、win32com.client.Dispatch()を通じてCpSysDib.StockChartを読み込んで作られたが、その内部が特にPythonicである必要は全くない。したがって、Pure Pythonとは異なるインターフェースを使用することになる。

object.SetInputValue(0, code)objectの銘柄をcodeに指定するが、Python的な文法で考えるとinstStockChart.code = 'A096530'のようにinstStockChartのプロパティであるcodeに直接アクセスして値を設定する方が自然だが、PythonではないのでCYBOS Plusの方式を踏襲することになる。

次に、データを期間で要求するか、数量で要求するかの指定である。

  • 1 - 要求区分(char)
    • ‘1’: 期間で要求
    • ‘2’: 数量で要求
instStockChart.SetInputValue(1, ord('2'))

しかし、指定する方法が少し変だ。ただの2ではなく、ord()関数で包んだord('2')を渡している。ord()は、ユニコード文字を表す文字列をユニコードポイントの整数に返す関数で、具体的にord('2')は整数50を返す。前述した理由と文脈を一緒にして、文字列の'2’をそのまま渡さずに、わざわざユニコードで渡す必要があるのもそういうわけだ。

しかし、次に何の値を要求するかの指定である。

  • 5 - フィールド(long array)
    • 5: 終値
    • 8: 取引量
    • 20: 機関純購入
instStockChart.SetInputValue(5, 5)

これは、Seegeneの終値データを要求しているということである。フィールドの種類は全部で0番から37番までの38種類があり、それぞれの詳細な使用法は公式ヘルプを参照してほしい。しかし、入力データで整数を使わないのになぜ要求区分(1)がわざわざ文字を受け取るのか、受け取ること自体はともかく、なぜ'1’と'2’が紛らわしいのかは分からない。そう思って先に進んでいくしかない。

今、上記コードがどんなデータを要求しているかについて全体的に理解してみよう。

days = 10
instStockChart = win32com.client.Dispatch("CpSysDib.StockChart")
instStockChart.SetInputValue(0, seegene)
instStockChart.SetInputValue(1, ord('2'))
instStockChart.SetInputValue(4, days)
instStockChart.SetInputValue(5, 5)
instStockChart.SetInputValue(6, ord('D'))
instStockChart.SetInputValue(9, ord('1'))

上から次の通りである。

  • 0 - 銘柄コード
    • Seegene (A096530)
  • 1 - 要求区分
    • ‘2’: 数量
  • 4 - 要求数量
    • days (10). 10日間のデータを要求する。
  • 5 - フィールド
    • 5: 終値. 市場を閉じる時の価格である。
  • 6 - チャート区分
    • ‘D’: 日次データ
  • 9 - 修正株価
    • ‘1’: 修正株価。増資、株分割など何らかの理由で株価の単位が変わっても、現在の価格に合った比率で株価を修正するかどうかである。Seegeneは21年前半に無償増資を行ったので、修正株価で要求するのが望ましいだろう。

こうして、instStockChartオブジェクトがデータを要求すると、「Seegeneの日次終値を修正株価で最近10日分だけ」受け取る。このオブジェクトのプロパティを設定したのと同じだ。

instStockChart.BlockRequest()

これでobject.BlockRequest()メソッドを実行すると、指定どおりのデータを受け取る。実際、この部分を見ると思考自体がPython的であることがわかる。

numData = instStockChart.GetHeaderValue(3)
for i in range(numData):
    print(instStockChart.GetDataValue(0, i), end = ', ')

GetHeaderValue(): 受信したヘッダーデータを返す。データとの違いは、なんとなくメタデータかどうかぐらいのようだが、モジュールによっても少し異なるので、公式ヘルプを直接見て理解するのが早いだろう。

  • 3: 受け取ったデータの数量を要求する。この例では最初に10日分のデータを要求したので、numDataは正確に10日分になる。期間で要求する場合、取引日ベースで受け取るため、この値はいくらでも変わり得る。

GetDataValue(Type,index): 受信したデータを返す。

  • Type番目に要求したタイプのindex番目の値を返す。この例では終値だけを要求したので、終値のi番目の値、つまり0番目のタイプを返すことになる。