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, >>>
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番目のタイプを返すことになる。