自己紹介
初めて投稿します。
普段は生産技術/生産システム/調達エンジニアとして働いています。
機械と電気とITを融合したメカトロニクスこそ日本の強みと思っています。
本業とはまったく別の趣味をアウトプットしてみようと思います。
株取引について
趣味です。
自己流では勝つことはできないようです。
統計分析が必要なようです。
何事も、計測⇒分析⇒対策⇒実行のPDCAサイクルが必要なのでしょうね。
株価取得について
無料でデータ取得するのにpandas-datareaderを採用しました。
なぜかポーランドのstooqという情報源です。最新データが一日遅れくらいです。
有料ならj-quantsがよいと思います。
データベースについて
将来的にデータ管理が必要と思い、pythonの個人利用ならsqliteという選択です。
バックテストについて
なにがよいのかわかりません。
とりあえずbacktesting.pyを選定しました。
tradingviewのpinescrptもやっていますが、無料枠の限界あり。
サンプルコード
from backtesting import Backtest, Strategy
from backtesting.lib import crossover
from backtesting.test import SMA
from pandas_datareader import data
import pandas as pd
import numpy as np
import datetime as dt
import sqlite3
# 変更する部分:複数の銘柄コードをリストで指定
codes = ['6927', '6752', '3607', '7014']
start = '2021/01/01'
end = dt.date.today() # 取得終了日
# SQLiteデータベースに接続
conn = sqlite3.connect('stock_data.db')
# 変更する部分:各銘柄コードに対して繰り返し処理
for code in codes:
df = data.DataReader(code+'.JP', 'stooq', start, end)
# DataFrameをSQLiteデータベースに保存
df.to_sql('stock_data_' + code, conn, if_exists='replace', index=True)
# データベース接続を閉じる
conn.close()
class SmaCross(Strategy):
n1 = 10
n2 = 20
def init(self): # 初期設定
price = self.data.Close
self.ma1 = self.I(SMA, price, self.n1)
self.ma2 = self.I(SMA, price, self.n2)
def next(self): # 売買条件
if crossover(self.ma1, self.ma2):
self.buy()
elif crossover(self.ma2, self.ma1):
self.sell()
# self.position.close(): 保有ポジションの手仕舞
# 変更する部分:各銘柄コードに対して繰り返し処理
for code in codes:
# SQLiteデータベースからデータを読み込む
conn = sqlite3.connect('stock_data.db')
query = f"SELECT * FROM stock_data_{code}"
df = pd.read_sql_query(query, conn)
conn.close()
# Backtestを使用して戦略を実行
bt = Backtest(df, SmaCross, cash=200000, commission=.002,
exclusive_orders=True)
stats = bt.run()
bt.plot()
print(stats)
# 最適化
output2 = bt.optimize(n1=range(10, 70, 5), n2=range(10, 70, 5))
print(output2)
bt.plot()
print(output2._strategy)
結言
日々、勉強して参ります。
皆様のご指導いただけると深甚です。