こんにちは 圧倒的かずまなぶです。seleniumの使用例として株式の自動判別をします。株式情報サイトをスクリーニングして各種指数を取得し、内部で演算した結果、買う価値があるかどうか検討する価値のある銘柄を出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
# coding: utf-8 import logging import pandas as pd from selenium import webdriver from time import sleep def auto(stock_number): print("---- start ----") #stock_number=5122 driver=webdriver.Chrome(r"C:\driver\chromedriver_win32\chromedriver.exe") #ウェブドライバを読み込む # 株式番号を入力して、キー レーションの一覧を表示する stock_number=stock_number url=r"https://www.morningstar.com/stocks/XTKS/"+str(stock_number)+r"/quote.html" driver.get(url) sleep(4) #print("ブラウザを開きました") # 現在の株価を取得する xpath_price='//*[@id="message-box-price"]' price=driver.find_element_by_xpath(xpath_price).text # \ と カンマを削除してfloat化する #print(price) price=price.replace(chr(165),"") .replace(".00","").replace(",","") price=float(price) #print(price) #キーレーションタブを押す xpath_key_rations=r'//*[@id="sal-components-quote"]/div[2]/div/div/div/div[2]/div[1]/div/ul/li[3]/a' tub_key_rations=driver.find_element_by_xpath(xpath_key_rations) tub_key_rations.click() sleep(2) #print("キーレーション タブを押しました") #フルキータブを押す xpath_full_key=r'//*[@id="sal-components-quote"]/div[2]/div/div/div/div[2]/div[2]/div/div[2]/div/a' tub_full_key_rations=driver.find_element_by_xpath(xpath_full_key) tub_full_key_rations.click() sleep(1) #print("フルキータブを押しました") # アクティブなURLを切り替える #print(driver.current_url) # 現在アクティブなURLを確認する driver.switch_to.window(driver.window_handles[1]) # アクティブなURLを切り替える sleep(1) #print(driver.current_url) # URLが切り替わっていることを確認する # Earnings Per Share を取得 xpath_eps=r'//*[@id="i5"]' key_eps=driver.find_element_by_xpath(xpath_eps).text eps=[] for i in range(1,12): xpath_eps=r'//*[@id="financials"]/table/tbody/tr[12]/td['+str(i)+']' eps+=[float(driver.find_element_by_xpath(xpath_eps).text)] eps={key_eps:eps} sleep(1) #print(eps) # Dividends を取得 xpath_dividends=r'//*[@id="i6"]' key_dividends=driver.find_element_by_xpath(xpath_dividends).text dividends=[] dividends+=[None] for i in range(2,12): xpath_dividends=r'//*[@id="financials"]/table/tbody/tr[14]/td['+str(i)+']' dividends+=[float(driver.find_element_by_xpath(xpath_dividends).text)] dividends={key_dividends:dividends} sleep(1) #print(dividends) # Book Value Per Share を取得 xpath_book=r'//*[@id="i8"]' key_book=driver.find_element_by_xpath(xpath_book).text book=[] for i in range(1,12): xpath_book=r'//*[@id="financials"]/table/tbody/tr[20]/td['+str(i)+']' book+=[float(driver.find_element_by_xpath(xpath_book).text)] book={key_book:book} sleep(1) #print(book) # Return on Equity % を取得 # Key Rationsタブを Profitability に切り替える xpath_growth=r'//*[@id="keyStatWrap"]/div/ul/li[1]/a' tub_growth=driver.find_element_by_xpath(xpath_growth) tub_growth.click() #sleep(0.1) #print("Profitabilityタブへ切り替え完了") xpath_roe=r'//*[@id="i26"]' key_roe=driver.find_element_by_xpath(xpath_roe).text roe=[] for i in range(1,12): xpath_roe=r'//*[@id="tab-profitability"]/table[2]/tbody/tr[12]/td['+str(i)+']' roe+=[driver.find_element_by_xpath(xpath_roe).text] roe={key_roe:roe} sleep(1) #print(roe) # Key Rationsタブを Growth に切り替える xpath_growth=r'//*[@id="keyStatWrap"]/div/ul/li[2]/a' tub_growth=driver.find_element_by_xpath(xpath_growth) tub_growth.click() sleep(1) #print("Growthタブへ切り替え完了") # EPS % を取得 xpath_eps_pct=r'//*[@id="gr-eps"]' key_eps_pct=driver.find_element_by_xpath(xpath_eps_pct).text eps_pct=[] xpath_eps_pct_yoy=r'//*[@id="tab-growth"]/table/tbody/tr[34]/td[10]' xpath_eps_pct_3y=r'//*[@id="tab-growth"]/table/tbody/tr[36]/td[10]' xpath_eps_pct_5y=r'//*[@id="tab-growth"]/table/tbody/tr[38]/td[10]' xpath_eps_pct_10y=r'//*[@id="tab-growth"]/table/tbody/tr[40]/td[10]' eps_pct.append(float(driver.find_element_by_xpath(xpath_eps_pct_yoy).text)) eps_pct.append(float(driver.find_element_by_xpath(xpath_eps_pct_3y).text)) eps_pct.append(float(driver.find_element_by_xpath(xpath_eps_pct_5y).text)) eps_pct.append(float(driver.find_element_by_xpath(xpath_eps_pct_10y).text)) eps_pct={key_eps_pct:eps_pct} sleep(1) #print(eps_pct) # データフレームを作成 : pd.concatでどんどんつなげていく。 # 軸を指定して、自動ソートを無効にする。: axis=1 df=pd.concat([pd.DataFrame(eps), pd.DataFrame(dividends), pd.DataFrame(book), pd.DataFrame(roe), pd.DataFrame(eps_pct)], axis=1) #print(df) stock_price=3425 as_asset=False as_dividends=False as_growths=False #print("現在の株価 : ",price) #(1)assets:ずっと持ち続ける資産株として # 直近のTTMに注目する book_value_per_share_ttm=book_value_per_share_ttm=df['Book Value Per Share * JPY'][len(df['Book Value Per Share * JPY'])-1] entry_1=book_value_per_share_ttm*0.8 review_1=book_value_per_share_ttm*1.0 if price<=entry_1: as_asset=True #print("資産株として 買い判定:{} エントリー価格 :{:.0f} レビュー価格:{:.0f}".format(as_asset,entry_1,review_1)) #(2)devidents:配当用の株として # 欲しい利回り日本株6%(米国株7%) 欲しい配当率 Yw 0.0 # Devidents / yield_target dividends_ttm=df['Dividends JPY'][len(df['Dividends JPY'])-1] yield_target=0.06 # 固定値 entry_2=dividends_ttm/yield_target review_2=entry_2*1.5 # 単純に1.5倍 if price<=entry_2: as_dividends=True #print("配当株として 買い判定:{} エントリー価格 :{:.0f} レビュー価格:{:.0f}".format(as_dividends,entry_2,review_2)) #(3)growths:成長株として eps_ttm=df['Earnings Per Share JPY'][len(df['Earnings Per Share JPY'])-1] eps_pct=df['EPS %'].min() entry_3=eps_ttm*eps_pct review_3=entry_3*1.2 # 単純に1.2倍 if price<=entry_3: as_growths=True #print("成長株として 買い判定:{} エントリー価格 :{:.0f} レビュー価格:{:.0f}".format(as_growths,entry_3,review_3)) print("証券NO. : ",stock_number) print("現在の株価 : ",int(price)) print("資産株として 買い判定:{} エントリー価格 :{:.0f} レビュー価格:{:.0f}".format(as_asset,entry_1,review_1)) print("配当株として 買い判定:{} エントリー価格 :{:.0f} レビュー価格:{:.0f}".format(as_dividends,entry_2,review_2)) print("成長株として 買い判定:{} エントリー価格 :{:.0f} レビュー価格:{:.0f}".format(as_growths,entry_3,review_3)) print("---- done ----") # ------ 以下、プログラム本体 ------------- #自動判別プログラムの対象とする銘柄のディクショナリを用意する dict_stock={"toei_animation":4816, "pilot":7846, "okamoto":5122, "tokan":5901} for stock_number in dict_stock.values(): auto(stock_number) print("---- all finished ----") |