Pythonで楽天RSSの株価取得するその2
前回の続き Pythonで楽天RSSから株価を取得する - けんぞの投資関連ブログ
楽天RSSで株価を取得する前に、MarketSpeedとRSSを立ち上げる必要があるが、 当然これもプログラムで自動的に立ち上げることができる。
しかし、pythonで立ち上げる処理を作成して立ち上げにも成功しているはずだが、なぜか株価取得がうまくいかなかった。 正確には、銘柄一覧は取得することができたが、株価がなぜか取得することができなかった。
Python以外で起動プログラムを書いてみると、問題なくMarketSpeedとRSSは立ち上がり、Pythonで株価が取得できた。
Pythonですべて完結したい人はこれをどこか改良すれば、株価は取得できるかもしれない
→久々にこのプログラムを見直したところ、RSS実行時にRSSディレクトリに移動して実行すれば問題なさそうでした。
おそらくRSS内でMarketSpeedにアクセスしているのですが、ディレクトリを移動せずRSSを実行していたため、
「定義ファイルがみつかりません。」とエラーが出てRSS起動が失敗していました。
import pyautogui market_speed = None market_speed_rss = None # RSSを起動します def start_rss(): global market_speed, market_speed_rss market_speed_path = r"F:\Program Files\MarketSpeed\MarketSpeed\MarketSpeed.exe" market_speed = subprocess.Popen(market_speed_path) time.sleep(10) pyautogui.keyDown("F3") # F3キーをショートカットキーに登録して、ログイン画面をポップアップさせる time.sleep(3) pyautogui.typewrite("********") #パスワード ログインIDは記録させておくため入力しない time.sleep(1) pyautogui.keyDown("Enter") time.sleep(3) pyautogui.keyDown("Esc") time.sleep(3) market_speed_rss_path = r"F:\Program Files\MarketSpeed\MarketSpeed\RSS.exe" current_dir = os.getcwd() market_speed_dir = os.path.split(market_speed_rss_path)[0] os.chdir(market_speed_dir) market_speed_rss = subprocess.Popen(market_speed_rss_path) os.chdir(current_dir) time.sleep(3) # RSSを停止します def stop_rss(): global market_speed, market_speed_rss market_speed.kill() market_speed_rss.kill()
なぜか、株価取得ができなかったため もともと、VBAで株価を取得する処理を作っていたため、VBAのマクロを呼ぶようにした。
# ExcelマクロをPythonから呼び出す import xlwings import app_config conf = app_config.AppConfig() # Excelマクロを実行します def execute_excel_macro(macro_name): work_book = xlwings.Book(’excelのPath’) macro = work_book.macro(macro_name) macro()
'MarketSpeedProcessID Dim objMS As Variant Dim objRSS As Variant 'RSS起動 Public Sub startRSS() Dim WshShell As Variant Dim password As String Set WshShell = CreateObject("WScript.Shell") WshShell.CurrentDirectory = "F:\Program Files\MarketSpeed\MarketSpeed" Set objMS = WshShell.Exec("F:\Program Files\MarketSpeed\MarketSpeed\MarketSpeed.exe") WshShell.AppActivate (objMS.processID) Call waitFor(15) WshShell.SendKeys ("{F3}") Call waitFor(5) WshShell.SendKeys ("*******") Call waitFor(5) WshShell.SendKeys ("{ENTER}") Call waitFor(5) WshShell.SendKeys ("{ESC}") Call waitFor(5) Set objRSS = WshShell.Exec("F:\Program Files\MarketSpeed\MarketSpeed\RSS.exe") Call waitFor(5) End Sub Public Sub stopRSS() Dim strRssProcName Dim strMSProcName Dim objProcList As Object Dim objProcess As Object strRssProcName = "RSS.exe" strMSProcName = "MarketSpeed.exe" Set objProcList = GetObject("winmgmts:").InstancesOf("win32_process") For Each objProcess In objProcList If objProcess.Name = strRssProcName Or objProcess.Name = strMSProcName Then objProcess.Terminate End If Next Set objMS = Nothing Set objRSS = Nothing Sleep 1 End Sub
Pythonで楽天RSSから株価を取得する
題目通りのPythonで楽天RSSから株価を取得する(Cold Linkで取得)だが、
PythonからDDEにアクセスする処理は以下のURLを参考すればよいです。
http://code.activestate.com/recipes/577654-dde-client/
前提条件
MarketSpeedにログインしアプリを立ち上げ、RealtimeSpreadSheetも起動しておくこと
def get_price():
stock_list = get_stock_list()
price_list = []
for topic in stock_list:
dde = DDEClient("RSS", topic)
if topic in ("N225", "TOPX", "JSD", "MTHR", "TSI2"):
price = {
"symbol": dde.request("指標コード").decode('sjis'),
"symbol_name": dde.request("指標名称").decode('sjis'),
"get_date": dde.request("現在日付").decode('sjis'),
"open_price": dde.request("始値").decode('sjis'),
"high_price": dde.request("高値").decode('sjis'),
"low_price": dde.request("安値").decode('sjis'),
"close_price": dde.request("現在値").decode('sjis'),
"volume": "",
"trading_value": "",
}
else:
price = {
"symbol": dde.request("銘柄コード").decode('sjis').strip(),
"symbol_name": dde.request("銘柄名称").decode('sjis').strip(),
"get_date": dde.request("現在日付").decode('sjis').strip(),
"open_price": dde.request("始値").decode('sjis').strip(),
"high_price": dde.request("高値").decode('sjis').strip(),
"low_price": dde.request("安値").decode('sjis').strip(),
"close_price": dde.request("現在値").decode('sjis').strip(),
"volume": dde.request("出来高").decode('sjis').strip(),
"trading_value": dde.request("売買代金").decode('sjis').strip(),
}
print(price)
price_list.append(price)
dde.__del__()
return price_list
# 株価取得銘柄一覧を取得します
def get_stock_list():
dde = DDEClient("RSS", "StockFind")
raw = dde.request("NULL").decode('sjis')
dde.__del__()
stock_lines = re.sub("^\n", "", raw).splitlines()
stock_list = []
for stock_row in stock_lines:
stock_cols = stock_row.split("\t")
stock_code = stock_cols[0]
if not (len(stock_code) == 5 and stock_code[-1] != "5"):
stock_list.append(stock_cols[0] + ".T")
# 指数も追加
stock_list.append("N225")
stock_list.append("TOPX")
stock_list.append("JSD")
stock_list.append("MTHR")
stock_list.append("TSI2")
return stock_list
処理の構成としては、
・銘柄一覧を取得 dde.requestはbyteでreturnされるのでsjisにdecodeが必要
・dde.__del__() が重要で、都度DDEを破棄しておくこと。
dde = DDEClient("RSS", "StockFind")
raw = dde.request("NULL").decode('Shift-JIS')
dde.__del__()
# 指数も追加
stock_list.append("N225")
stock_list.append("TOPX")
stock_list.append("JSD")
stock_list.append("MTHR")
stock_list.append("TSI2")
・銘柄一覧(stock_list)をFor文でぐるぐるまわし、各銘柄ごとに株価を取得
銘柄と指数では取得するitem名が異なるので注意が必要
for topic in stock_list:
dde = DDEClient("RSS", topic)
if topic in ("N225", "TOPX", "JSD", "MTHR", "TSI2"):
price = {
"symbol": dde.request("指標コード").decode('sjis'),
else:
price = {
"symbol": dde.request("銘柄コード").decode('sjis').strip(),
すべて株価取得成功できればよいが、何個か取得失敗する可能性があるので、取れていない株価は再取得するロジックも必要かと思う。が、ここでは記述しない。
続き