ストックドッグ

KatoTakahiro。金融系の会社で働くSEが株やPython、その他諸々について書いています。サービスも運営してます→http://fmbrain.work

seleniumで自動売買 〜SBI証券から自動で株を買ってみる〜

自動売買ってどうやってやるの?

アルゴリズムトレードが昨今流行りではありますが。

残念ながら日本の証券会社は一般向けに株式売買のAPIは公開されていません。

そのため、APIを通してのアルゴリズムによる株の自動売買は現状できません。

FXやビットコインAPIが公開されているので、アルゴリズムで自動売買を行っている人が多いようですが、株式で自動売買をやっている人があまりいないのはここらへんの理由かと思います。

(高頻度取引は東京証券取引所に登録すれば可能なようですが、調べてもあまり情報がでてきません、個人では行えず法人のみっぽいです)

最近、銀行の取引をAPI化して業務提携をする動きが盛んになってきていますが、証券会社が売買等のシステムをAPI化する話はあまり聞きません。

こういった話は国主導で進めるので、明日急にAPI公開なんてことにはならないので、株式売買のAPI公開はいったん諦めましょう。


では、どうやるか。

どうやらseleniumというウェブのUI自動テストツールが使えそうです。

seleniumはクリックや文字入力をプログラムを通して、自動で行えることができるライブラリです。

もともとはシステムのテストを自動化する目的で発展してきたようですが、これを使ってウェブを操作することもできます。

つまり、SBI証券にログインして、株を売買する動きもseleniumで再現できるということです。

seleniumの簡単な使い方の記事

前にyoutubeで「yui」と検索するコードをseleniumで書きました。

doz13189.hatenablog.com

これをちょっと変えるだけで、SBI証券にログインして株を売買するってのはできそうです。

SBI証券にログインして株を買ってみる

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys


class PythonOrgSearch(unittest.TestCase):


	def setUp(self):
		
		self.driver = webdriver.Chrome("/home/ubuntu/robo/chromedriver")


	def test_serch_in_python_org(self, signal=1):
		driver = self.driver

		#SBI証券のHP
		driver.get("https://www.sbisec.co.jp/ETGate")

		#SBI証券のログインID
		driver.find_element_by_name("user_id").send_keys("login_id")

		#SBI証券のログインパスワード
		driver.find_element_by_name("user_password").send_keys("login_password")
		driver.find_element_by_name("ACT_login").click()

		driver.find_element_by_xpath('//div[@id="link02M"]/ul/li[2]').click()

		if signal == 1:
			PythonOrgSearch.buy(self)

		elif signal == 0:
			PythonOrgSearch.sell(self)


	def tearDown(self):
		self.driver.close()


	def buy(self):
		print("buy")

		driver = self.driver

		#現物買にチェック
		driver.find_element_by_name("trade_kbn").click()
		
		#銘柄コードを入力
		driver.find_element_by_name("stock_sec_code").send_keys(1305)
		
		#売買株数を入力
		driver.find_element_by_name("input_quantity").send_keys(100)
		
		#価格指定
		driver.find_element_by_xpath('//td[@id="gsn1"]/input').click()

		#預かり区分を指定
		driver.find_element_by_name("hitokutei_trade_kbn").click()
		
		#取引パスワードを入力
		driver.find_element_by_name("trade_pwd").send_keys("trade_password")

		#注文確認画面をクリック
		driver.find_element_by_name("ACT_estimate").click()

		#注文発注
		driver.find_element_by_name("ACT_place").click()


	def sell(self):
		print("sell")

if __name__ == "__main__":
    unittest.main()

HTMLの構造上、find_element_by_nameで要素を取得できない部分はxpathを使いました。

成行か指値か、を選択するところがまさにそれで、仕方がなくxpathを使っています。

SBI証券はHPにJaveScriptを使用していないので、selenium単体で全ての操作を完結させることができました。

selenium自体の使い方はシンプルなので、コードを書くと言ってもHTMLの構造を読むのがメインでした。

このコードを実行すると...

銘柄コード1305の株を100株、成行で買います。

東京証券取引所が開いている時間に実行すると、本当に約定してしまうので夜に実行しましたが、しっかりと注文できました。

seleniumゆえの欠点

上記のコードは単体テストのライブラリをインポートして、全ての操作の開始から終了までの時間を計測しています。

結果的に全ての操作を終えるのに、22秒程度かかります。

インターネットの接続状況によってはもう少しかかる場合もあります。

つまり、注文に時間がかかりすぎです。

1日1回や2回程度ならこの程度のスピードで十分ですが、頻度を上げるには少し実行速度が遅いように思います。

そのため、売買まで20〜30秒程度なら許容できるアルゴリズム取引戦略が必要になります。

デイトレをするには心もとないので、やはりスイングトレードかなぁなんて思っています。


以上終わり。