2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pandas-datareaderで株価取得してsqliteに保存とbacktestingする方法

Posted at

自己紹介

 初めて投稿します。
 普段は生産技術/生産システム/調達エンジニアとして働いています。
 機械と電気と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)

 

結言

 日々、勉強して参ります。
 皆様のご指導いただけると深甚です。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?