auカブコム証券が提供している、kabuステーションAPIをPythonで操作する方法を解説します。
streamlit というライブラリーを使って、ブラウザ上にアプリケーションを作成。
今回はPUSH配信されたリアルタイム株価を評価して、自動発注する方法を解説いたします。
※注意事項
ブログに掲載しているサンプルコードを実行すると、実際に証券会社に発注されてしまいます。
意図しない価格で発注され約定してしまったり、連続して誤発注注文が出される可能性もあります。
このブログのサンプルコードは、動作テスト用に作成したものです。
例外処理なども実装していませんので、このサンプルコードをそのまま使って自動売買は絶対に行わないでください。
自動発注処理の流れ
- 発注条件を指定
- 株価を取得したい銘柄を登録
- PUSH配信スタート
- PUSH配信されたリアルタイムデータから必要な情報を取得
- 発注条件に合致したら、指定された銘柄を自動発注
- PUSH配信を停止
※PUSH配信:価格情報が更新されると自動的に情報が配信される
発注条件を指定
発注条件を指定します。
今回は2銘柄を使った発注条件を指定します。
自動発注の条件
トリガーとして指定されたA銘柄の株価が指定された条件に達したときに、B銘柄の発注を実行。
<例>
トヨタ自動車:7203(A銘柄)の株価が1万円以上になったら、
KDD:I9433(B銘柄) 3400円で指し値買い注文を出す。
※例としてトリガー(A銘柄)と発注銘柄(B銘柄)を別銘柄にしていますが、両方同じ銘柄でも構いません。
Streamlitで発注条件登録アプリ作成
PythonライブラリーのStreamlitを使って発注条件登録アプリを作成します。
※ 「自分で作成したauカブコム証券APIの関数をインポート」については、後で説明します。
このコードは main.pyに記述しています。
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 |
streamlit ブラウザ上にアプリケーションを作成するライプラリーをインポート import streamlit as st # 自分で作成したauカブコム証券APIの関数をインポート import ats_function # 設定ファイルをインポート import settings # インポートしたsettingsからパスワードを取得して変数に代入 APIPassword = settings.APIPassword Password = settings.Password # タイトルを表示 st.title('初めてのトレーディングアプリ作成') # テキストを表示 st.write('「個人投資家に、デジタルの武器を」') # マークダウン記法でタイトルを表示 st.markdown('# 自動発注設定') 'ここで自動発注条件の登録をおこないます。' '## ◇自動発注の条件' 'トリガーとして指定されたA銘柄の株価が指定された条件に達したときに、B銘柄の発注を行います。' st.markdown('## トリガー銘柄登録') '### 発注する条件を指定します。' '※実際に発注する銘柄ではありません。' '発注トリガーとなる銘柄の証券コードと,発注条件を登録してください。' trigger_stock_code = st.text_input('発注トリガーとなる銘柄コードを入力') '入力された証券コード:',trigger_stock_code '### 発注条件を登録してください。' 'ここで指定した価格を超えた場合,発注銘柄として登録した銘柄が発注されます。' trigger_stock_price = st.text_input('トリガーとなる価格を入力') '入力されたトリガー価格:',trigger_stock_price |
このPythonコードを実行すると、ブラウザにアプリケーションが立ち上がります。
テキスト入力エリアに、発注トリガー(A銘柄)条件を登録します。
つづいて、トリガーとして指定されたA銘柄の株価が指定された条件に達したときに、発注されるB銘柄の発注条件を登録するコードを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
st.markdown('## 発注銘柄登録') '### 発注する銘柄の証券コードを登録してください。' stock_code = st.text_input('発注する銘柄コードを入力') '入力された証券コード:',stock_code '### 発注数量を登録してください。' Order_quantity = st.text_input('発注数量を入力') '入力された発注数量:',Order_quantity '### 発注価格を登録してください。' Order_price = st.text_input('発注価格を入力') '入力された発注数量:',Order_price |
発注されるB銘柄の発注条件を登録する画面がこちら。
株価を取得したい銘柄を登録
株価を取得したい銘柄を登録します。
auカブコム証券APIホームページのリンクから公式サンプルコードを取得しました。
https://kabucom.github.io/kabusapi/ptal/index.html
サンプルコードの使い方は、公式ホームページのリファレンスを参照ください。
PUSH配信で株価を取得したい銘柄を登録するサンプルコードを関数化しました。
関数は ats_function.py ファイルに記述しています。
PUSH配信で株価を取得したい銘柄を登録するには、先にトークンを取得する必要があるのでトークンを取得するコードも一緒に記述します。
APIPassword や Password は 設定ファイル settings から取得しています。
このブログ記事では、設定ファイル settingsからパスワードを取得する手順の説明は省かせていただきます。
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 |
import urllib.request import pprint import json # 設定ファイル import settings APIPassword = settings.APIPassword Password = settings.Password #トークンの取得 def generate_token(): obj = {'APIPassword': APIPassword} json_data = json.dumps(obj).encode('utf8') url = 'http://localhost:18080/kabusapi/token' req = urllib.request.Request(url, json_data, method='POST') req.add_header('Content-Type', 'application/json') try: with urllib.request.urlopen(req) as res: content = json.loads(res.read()) token_value = content.get('Token') except urllib.error.HTTPError as e: print(e) return token_value # 18.銘柄登録 def ats_register(token): # 銘柄コード # ※次の形式で入力してください。 # [銘柄コード] @ [市場コード] # ※市場コードは下記の定義値から選択してください。 市場コード # 定義値 説明 # 1 東証 # 3 名証 # 5 福証 # 6 札証 # 2 日通し # 23 日中 # 24 夜間 obj = {'Symbols': [ {'Symbol': '101', 'Exchange': 1}, # 日経平均株価 {'Symbol': '151', 'Exchange': 1}, # TOPIX {'Symbol': '1320', 'Exchange': 1}, # ダイワ 上場投信-日経225 {'Symbol': '1321', 'Exchange': 1}, # NEXT FUNDS 日経平均225連動型上場投資信託 {'Symbol': '1306', 'Exchange': 1}, # NEXT FUNDS TOPIX連動型上場投信 {'Symbol': '9983', 'Exchange': 1}, # ファーストリテイリング {'Symbol': '9984', 'Exchange': 1}, # ソフトバンクグループ {'Symbol': '9433', 'Exchange': 1}, # KDDI {'Symbol': '7203', 'Exchange': 1}, # トヨタ自動車 {'Symbol': '166090019', 'Exchange': 2}, # 日経225mini 21/09 {'Symbol': '166100019', 'Exchange': 2}, # 日経225mini 21/10 {'Symbol': '166110019', 'Exchange': 2}, # 日経225mini 21/11 {'Symbol': '166120019', 'Exchange': 2}, # 日経225mini 21/12 {'Symbol': '166090018', 'Exchange': 2}, # 日経平均先物 21/09 {'Symbol': '166120018', 'Exchange': 2} # 日経平均先物 21/12 # ... 50件まで登録可 ]} json_data = json.dumps(obj).encode('utf8') url = 'http://localhost:18080/kabusapi/register' req = urllib.request.Request(url, json_data, method='PUT') req.add_header('Content-Type', 'application/json') req.add_header('X-API-KEY', token) try: with urllib.request.urlopen(req) as res: # print(res.status, res.reason) # for header in res.getheaders(): # print(header) # print() content = json.loads(res.read()) pprint.pprint(content) except urllib.error.HTTPError as e: print(e) content = json.loads(e.read()) pprint.pprint(content) except Exception as e: print(e) |
この下に示す部分で銘柄を登録しています。
‘Symbol’: ‘9433’ この文字列が証券コードなので、この値を変更すれば他の銘柄も登録出来ます。
登録出来る最大数は50銘柄です。(2021年8月14日現在)
{‘Symbol’: ‘101’, ‘Exchange’: 1}, # 日経平均株価
{‘Symbol’: ‘151’, ‘Exchange’: 1}, # TOPIX
{‘Symbol’: ‘1320’, ‘Exchange’: 1}, # ダイワ 上場投信-日経225
{‘Symbol’: ‘1321’, ‘Exchange’: 1}, # NEXT FUNDS 日経平均225連動型上場投資信託
{‘Symbol’: ‘1306’, ‘Exchange’: 1}, # NEXT FUNDS TOPIX連動型上場投信
{‘Symbol’: ‘9983’, ‘Exchange’: 1}, # ファーストリテイリング
{‘Symbol’: ‘9984’, ‘Exchange’: 1}, # ソフトバンクグループ
{‘Symbol’: ‘9433’, ‘Exchange’: 1}, # KDDI
{‘Symbol’: ‘7203’, ‘Exchange’: 1}, # トヨタ自動車
{‘Symbol’: ‘166090019’, ‘Exchange’: 2}, # 日経225mini 21/09
{‘Symbol’: ‘166100019’, ‘Exchange’: 2}, # 日経225mini 21/10
{‘Symbol’: ‘166110019’, ‘Exchange’: 2}, # 日経225mini 21/11
{‘Symbol’: ‘166120019’, ‘Exchange’: 2}, # 日経225mini 21/12
{‘Symbol’: ‘166090018’, ‘Exchange’: 2}, # 日経平均先物 21/09
{‘Symbol’: ‘166120018’, ‘Exchange’: 2} # 日経平均先物 21/12
PUSH配信スタート
PUSH配信をスタートさせましょう。
PUSH配信される毎に、株価をチエックして発注条件に合致しているか確認する為、発注条件を引数として渡します。
発注条件を引数として渡しすコードは main.pyに記述しています。
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 |
st.markdown('# 自動発注の監視') if st.button('自動発注監視スタート'): st.write('自動発注の監視中です。') # トークン取得 token_value = ats_function.generate_token() print(token_value) # st.write('トークンを取得しました:',token_value) # 自動発注をするかしないかのフラグ設定 trade_flag = 1 #登録された引数のデーター型を合わせる. # 未登録であれば規定値を代入 # ※動作テスト用に規定値を代入しているが、実運用では未入力時に警告を出す等のコードを追加する if trigger_stock_code == "": trigger_stock_code = '166090019' if trigger_stock_price == "": trigger_stock_price = 27000 else: # 入力された値を整数型に変換 trigger_stock_price = int(trigger_stock_price) if stock_code == "": stock_code = 1320 else: # 入力された値を整数型に変換 stock_code = int(stock_code) if Order_quantity == "": Order_quantity = 1 else: # 入力された値を整数型に変換 Order_quantity = int(Order_quantity) if Order_price == "": Order_price = 28000 else: # 入力された値を整数型に変換 Order_price = int(Order_price) # PUSH配信の引数 # '入力された証券コード:', trigger_stock_code # '入力されたトリガー価格:', trigger_stock_price # '入力された証券コード:', stock_code # '入力された発注数量:', Order_quantity # '入力された発注価格:', Order_price # #PUSH配信開始 ats_function.ats_websocket( trade_flag, trigger_stock_code, trigger_stock_price, stock_code, Order_quantity, Order_price ) |
アプリ上に[自動発注の監視スタート]ボタンが表示されるので、ボタンを押すとPUSH配信の関数が実行されます。
PUSH配信の引数は「自動発注の条件」にて登録された、証券コードや数量、価格です。
def ats_websocket(PUSH配信の引数)
PUSH配信の引数
トレードフラグ : trade_flag #この関数内では使用しない
入力された証券コード : trigger_stock_code
入力されたトリガー価格 : trigger_stock_price
入力された証券コード : stock_code
入力された発注数量 : Order_quantity
入力された発注価格 : Order_price
このコードもauカブコム証券API公式サンプルコードを元に関数化しています。
def ats_websocket() 関数は ats_function.py ファイルに記述しています。
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 |
import urllib.request import pprint import json # websocket関数に使用する import sys import websocket import _thread # 17.PUSH配信開始 def ats_websocket( trade_flag, trigger_stock_code, trigger_stock_price, stock_code, Order_quantity, Order_price): TRADE_FLAG = trade_flag # kabuステーションのサーバから通知が来た時に呼ばれる def on_message(ws, message): print('--- RECV MSG. --- ') # print(message) print('===json print===') # json.loads() でJSONドキュメントを含んだ文字列をPythonオブジェクトへ変換する content = json.loads(message) print(content) # 配信されたデーターの処理は別の関数で実行 # 配信された情報を関数に渡す TRADE_FLAG = receive_websocket(content, trade_flag, trigger_stock_code, trigger_stock_price, stock_code, Order_quantity, Order_price) if TRADE_FLAG == 0: print('TRADE_FLAG = 0: websocket closing...') ws.close() return content def on_error(ws, error): print('--- ERROR --- ') print(error) def on_close(ws): print('--- DISCONNECTED --- ') # WebSoketが実行されると最初に呼ばれる関数 def on_open(ws): print('--- CONNECTED --- ') def run(*args): while (True): # Pythonでは「sys.stdin」でキーボードからの標準入力を使うことが出来る # (キーボードで入力された文字を受け取ることができます) # 【sys.stdin.read】複数行の入力 → 1つの文字列に格納される line = sys.stdin.readline() # != は、等価でないとTrue、等価だとFalseを返す。 if line != '': print('closing...') ws.close() _thread.start_new_thread(run, ()) url = 'ws://localhost:18080/kabusapi/websocket' # websocket.enableTraceの引数をFalseからTrueにすると、 # websocket - clientモジュールのログが出力され、最初のHTTPを利用したコネクション確立のやりとりが確認出来る # websocket.enableTrace(True) ws = websocket.WebSocketApp(url, on_message=on_message, on_error=on_error, on_close=on_close) ws.on_open = on_open ws.run_forever() |
上のコード78行目 ws.run_forever()が実行されると、登録された銘柄の価格情報が更新されるたびにデーターがPUSH配信されます。
まさに雪崩のようにデーターが押し寄せるイメージです。
下はPyCharmの画面の一部ですが、データーが取得されている様子です。
データのPUSH配信を受け取ると、
上のコード22行目の関数 def on_message(ws, message): が呼ばれ、
print(‘— RECV MSG. — ‘) と print(‘===json print===’) が出力されています。
上のコード28行目でPUSH配信で送られてきたデータの形式をjsonからPythonオブジェクトに変換して、
print(content)で出力しています。 {}で囲まれたデーターがPUSH配信されたデーターの実体です。
※それ以外の出力データーは他の関数から出力されたデーターなので、この場では無視してください。
PUSH配信されたリアルタイムデータから必要な情報を取得
PUSH配信されたリアルタイムデータから必要な情報を取得します。
Pythonコードを単純にするために、PUSH配信の関数の中に発注までの一連のコードを埋め込んでしまうことも考えました。
しかし、今後の展開(機能拡張)も見据えて配信されたデーターの処理から、発注までの処理は別の関数に切り出しました。
上の章で説明したコード33行目で、データーを receive_websocket() 関数に渡しています。
def receive_websocket(引数)
引数
PUSH配信されたデーター : content
トレードフラグ : trade_flag
入力された証券コード : trigger_stock_code
入力されたトリガー価格 : trigger_stock_price
入力された証券コード : stock_code
入力された発注数量 : Order_quantity
入力された発注価格 : Order_price
receive_websocket() 関数は ats_function.py ファイルに記述しています。
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 |
# PUSH配信された情報を受け取る def receive_websocket(content, trade_flag, trigger_stock_code, trigger_stock_price, stock_code, Order_quantity, Order_price): # PUSH配信された情報から 'Symbol' 'SymbolName' "CurrentPrice" を抽出する content_Symbol = content['Symbol'] content_SymbolName = content['SymbolName'] content_CurrentPrice = content["CurrentPrice"] # content_Sell1_Price = content["Sell1"]['Price'] # print('content_Sell1_Price', content_Sell1_Price) print('print f-strings') print(f'content_Symbol:{content_Symbol}' f'content_SymbolName:{content_SymbolName}' f'content_CurrentPrice{content_CurrentPrice}') print('関数receive_websocketのtrigger_stock_code',trigger_stock_code) # 配信されたデーターがトリガー銘柄であれば、価格条件を確認 if content_Symbol == trigger_stock_code: #トリガー銘柄の価格条件を確認 if content_CurrentPrice >= trigger_stock_price: # 価格条件を達していれば発注する print("発注条件に到達しました") # 作成した発注関数で発注する ats_sendorder_margin_new(trade_flag, stock_code, Order_quantity, Order_price) trade_flag = 0 return trade_flag |
上のコード11行目から13行目で、# PUSH配信された情報から ’Symbol’ ’SymbolName’ ”CurrentPrice” を抽出しています。
content_Symbol = content[‘Symbol’]
content_SymbolName = content[‘SymbolName’]
content_CurrentPrice = content[“CurrentPrice”]
上のコード18行目から23行目で、抽出したデーターを出力しています。
print(‘print f-strings’)
print(f’content_Symbol:{content_Symbol}’
□□□□f’content_SymbolName:{content_SymbolName}’
□□□□f’content_CurrentPrice{content_CurrentPrice}’)
print(‘関数receive_websocketのtrigger_stock_code’,trigger_stock_code)
発注条件に合致したら、指定された銘柄を自動発注
発注条件に合致したら、指定された銘柄を自動発注します。
いよいよ発注までたどり着きました。
条件判断から発注へのPythonコードは、
上の章で解説した、receive_websocket() 関数内に記述しています。
receive_websocket() 関数は ats_function.py ファイルに記述しています。
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 |
# PUSH配信された情報を受け取る def receive_websocket(content, trade_flag, trigger_stock_code, trigger_stock_price, stock_code, Order_quantity, Order_price): # PUSH配信された情報から 'Symbol' 'SymbolName' "CurrentPrice" を抽出する content_Symbol = content['Symbol'] content_SymbolName = content['SymbolName'] content_CurrentPrice = content["CurrentPrice"] # content_Sell1_Price = content["Sell1"]['Price'] # print('content_Sell1_Price', content_Sell1_Price) print('print f-strings') print(f'content_Symbol:{content_Symbol}' f'content_SymbolName:{content_SymbolName}' f'content_CurrentPrice{content_CurrentPrice}') print('関数receive_websocketのtrigger_stock_code',trigger_stock_code) # 配信されたデーターがトリガー銘柄であれば、価格条件を確認 if content_Symbol == trigger_stock_code: #トリガー銘柄の価格条件を確認 if content_CurrentPrice >= trigger_stock_price: # 価格条件を達していれば発注する print("発注条件に到達しました") # 作成した発注関数で発注する ats_sendorder_margin_new(trade_flag, stock_code, Order_quantity, Order_price) trade_flag = 0 return trade_flag |
上のコード26行目のif文で、配信されたデーターがトリガーとして指定された銘柄か判断。
配信されたデーターがトリガーとして指定された銘柄であれば、
上のコード28行目のif文で、トリガーとして指定された銘柄の価格条件を確認して、
価格条件を達していれば発注します。
発注の関数は ats_sendorder_margin_new()です。
ats_sendorder_margin_new(引数)
引数
トレードフラグ : trade_flag
入力された証券コード : stock_code
入力された発注数量 : Order_quantity
入力された発注価格 : Order_price
ats_sendorder_margin_new() 関数は ats_function.py ファイルに記述しています。
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 |
# 3.注文発注(信用) def ats_sendorder_margin_new(trade_flag, stock_code, Order_quantity, Order_price): token = generate_token() obj = {'Password': Password, 'Symbol': stock_code, 'Exchange': 1, 'SecurityType': 1, 'FrontOrderType': 20, 'Side': '2', 'CashMargin': 2, 'MarginTradeType': 2, 'DelivType': 0, 'AccountType': 2, 'Qty': Order_quantity, 'Price': Order_price, 'ExpireDay': 0} json_data = json.dumps(obj).encode('utf-8') url = 'http://localhost:18080/kabusapi/sendorder' req = urllib.request.Request(url, json_data, method='POST') req.add_header('Content-Type', 'application/json') req.add_header('X-API-KEY', token) try: with urllib.request.urlopen(req) as res: print(res.status, res.reason) for header in res.getheaders(): print(header) print() content = json.loads(res.read()) pprint.pprint(content) except urllib.error.HTTPError as e: print(e) content = json.loads(e.read()) pprint.pprint(content) except Exception as e: print(e) |
上のコード6行目で、token(トークン)を取り直しています。
token(トークン)は、kabuステーションとの接続が切れたり、別の関数からtoken(トークン)を再取得すると、変わってしまいます。
自動発注条件に達するまでの間に、トークンが変わっている可能性があるので、発注前にtoken(トークン)を取り直しています。
自動で発注された瞬間の画像です。
PUSH配信を停止
PUSH配信は停止指示をするまで、価格情報を配信し続けます。
今回の発注プログラムでは、発注したらその後に何もしないのでPUSH配信も停止させます。
お気付きの方もいらっしゃると思いますが、PUSH配信停止の仕組みは、
receive_websocket()関数と ats_websocket()関数に組み込まれています。
receive_websocket()関数内コード28行目のif文で発注する事が決まった時点で、
trade_flag=0 としています。 :コード36行目
コード37行目で、trade_flagを関数の戻り値としています。
receive_websocket()関数は、ats_websocket()関数から呼び出されましたので、戻り値はats_websocket()関数内に戻ります。
下のコード33行目で戻り値がTRADE_FLAGに代入されています。 値は 0 です。(下のコードはats_websocket())
TRADE_FLAGの値は ”0” です。
41行目のif文で、TRADE_FLAGの値は ”0” なので、次の2行が実行されます。
42行目 print(‘TRADE_FLAG = 0: websocket closing…’) が出力
43行目 ws.close() でprint(‘TRADE_FLAG = 0: websocket closing…’) が出力
自動で発注された瞬間の画像をもう一度見てみましょう。
画像の下部を拡大します。
print(‘TRADE_FLAG = 0: websocket closing…’) が出力され、PUSH配信が停止されていることが分かります。
まとめ
リアルタイム株価データーを使って株の自動発注をする方法を解説しました。
Pythonコードや解説記事の内容を初心者向けに分かりやすいように、心がけたつもりですが、読み返してみると「解説が不足しているなぁ」と思う部分が多く見つかりました。
このブログ記事と同じ内容の解説動画をYouTubeにアップしました。
動画では、より細かくPythonコードの解説をしていますので、よろしければご覧下さい。
はじめにもお伝えしましたが、注意事項をよくお読みになりサンプルコードの取り扱いには十分注意願います。
※注意事項
ブログに掲載しているサンプルコードを実行すると、実際に証券会社に発注されてしまいます。
意図しない価格で発注され約定してしまったり、連続して誤発注注文が出される可能性もあります。
このブログのサンプルコードは、動作テスト用に作成したものです。
例外処理なども実装していませんので、このサンプルコードをそのまま使って自動売買は絶対に行わないでください。
特定の銘柄の売買を推奨・投資の勧誘を目的としたものではありません。最終的な投資決定は、ご自身の判断でなさるようにお願いいたします。
このブログ記事のサンプルコードを使用して発生した損失について、責任は負いかねますのでご了承ください。
動画で解説
公開日時:2021年8月21日 20時予定
この記事を書いた人
あしおゆたか
投資歴21年の個人投資家
机上の理論ではなく、実体験に基づいた記事作りをモットーにしています。
スポーツクラブに毎週2日~3日通い、サウナ後の暴飲暴食が趣味。(現在自粛中)
◇主な投資対象
日本株式
株式ETF(上場投資信託)
日経225先物
日経225先物オプション
◇運営者情報はこちら