※本記事には広告・アフィリエイトリンクが含まれます。収益はサイト運営・検証費用に充てています。
結論から言うと:
- SBI証券のCSVはShift-JIS(cp932)エンコードのため、読み込み時にencodingを指定しないとエラーになる仕組みです
- pandasのread_csvで読み込み後、日付列をDatetime型に変換することで時系列分析が可能になる
- yfinanceと組み合わせることで、保有株の実績データとリアルタイムデータを並べて分析できる
CSVダウンロード手順
SBI証券のウェブサイトにログイン後、「口座管理」→「取引履歴」または「保有証券一覧」から対象期間を指定してCSVダウンロードできます。ファイル名はyyyymmdd_trade.csvのような形式になることが多いです。
基本の読み込みコード
pandasでSBI証券のCSVを読み込む基本コードです。
import pandas as pd
df = pd.read_csv("sbi.csv", encoding="cp932")
print(df.head())
print(df.dtypes)
文字コード問題(Shift-JIS/cp932)
SBI証券のCSVはShift-JIS(Windowsではcp932)で保存されています。encodingを指定しないとUnicodeDecodeErrorが発生する仕組みです。
# encodingを指定しない場合はエラーになる
df = pd.read_csv("sbi.csv") # NG
# cp932を指定する
df = pd.read_csv("sbi.csv", encoding="cp932") # OK
# それでも読めない場合はshift_jisを試す
df = pd.read_csv("sbi.csv", encoding="shift_jis")
日付列をDatetimeに変換
CSVの日付列は文字列として読み込まれるため、時系列分析の前にDatetime型に変換します。
df['約定日'] = pd.to_datetime(df['約定日'], format='%Y/%m/%d')
df = df.set_index('約定日')
df = df.sort_index()
print(df.index)
終値グラフ化
読み込んだデータをmatplotlibでグラフ化します。
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('Agg') # ヘッドレス環境向け
df['約定単価'].plot(figsize=(12, 5), title='約定単価の推移')
plt.xlabel('日付')
plt.ylabel('価格(円)')
plt.tight_layout()
plt.savefig('sbi_chart.png')
print('グラフ保存: sbi_chart.png')
複数CSVをまとめて読み込む
月ごとにCSVが分かれている場合、globで一括読み込みできます。
import glob
import pandas as pd
files = glob.glob("sbi_*.csv")
dfs = [pd.read_csv(f, encoding="cp932") for f in files]
df_all = pd.concat(dfs, ignore_index=True)
print(f"合計行数: {len(df_all)}")
yfinanceと組み合わせる
SBI証券CSVの保有銘柄コードを使ってyfinanceでリアルタイムデータを取得し、実績と比較できます。
import yfinance as yf
# SBI CSVから銘柄コードを取得(例:7203 → 7203.T)
code = "7203.T"
ticker = yf.Ticker(code)
current = ticker.history(period="1d")['Close'].iloc[-1]
print(f"現在値: {current:.0f}円")
筆者の検証メモ
SBI証券のCSVはバージョンや取得画面によってカラム名が異なる場合がある。読み込み後まずprint(df.columns)でカラム名を確認してから作業を進めると、AttributeErrorを防げる。また、数値列にカンマが入っている場合はthousands=’,’オプションをread_csvに追加すると整数に変換される仕組みです。
【投資免責事項】本記事で紹介するコードおよび分析結果は情報提供を目的としたものであり、特定の銘柄への投資を推奨するものではありません。投資判断はご自身の責任で行ってください。

