seleniumで自動売買 〜SBI証券から自動で株を買ってみる〜
自動売買ってどうやってやるの?
アルゴリズムトレードが昨今流行りではありますが。
残念ながら日本の証券会社は一般向けに株式売買のAPIは公開されていません。
そのため、APIを通してのアルゴリズムによる株の自動売買は現状できません。
FXやビットコインはAPIが公開されているので、アルゴリズムで自動売買を行っている人が多いようですが、株式で自動売買をやっている人があまりいないのはここらへんの理由かと思います。
(高頻度取引は東京証券取引所に登録すれば可能なようですが、調べてもあまり情報がでてきません、個人では行えず法人のみっぽいです)
最近、銀行の取引をAPI化して業務提携をする動きが盛んになってきていますが、証券会社が売買等のシステムをAPI化する話はあまり聞きません。
こういった話は国主導で進めるので、明日急にAPI公開なんてことにはならないので、株式売買のAPI公開はいったん諦めましょう。
では、どうやるか。
どうやらseleniumというウェブのUI自動テストツールが使えそうです。
seleniumはクリックや文字入力をプログラムを通して、自動で行えることができるライブラリです。
もともとはシステムのテストを自動化する目的で発展してきたようですが、これを使ってウェブを操作することもできます。
seleniumの簡単な使い方の記事
前にyoutubeで「yui」と検索するコードをseleniumで書きました。
これをちょっと変えるだけで、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の構造を読むのがメインでした。