2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

投資損益データの可視化をGeminiで

Last updated at Posted at 2025-02-09

きっかけ

2024年の大納会が終わったタイミングでこれまでの税引き後損益の累積を可視化しようと思った.コード自体はGeminiに聞いて小一時間でできたんだけど,だらけすぎた年始が過ぎて修論が始まって全力で駆け抜けて,気付けば2月.修論発表が終わったので記事を書く.

前提

  • 言語はPython
  • Googleアカウントを持っていること

今回やったこと

  • CSVファイルの取得
  • Geminiに頼んで作ってもらう
    • 銘柄ごとの税引き後損益を求める
    • ついでに可視化

CSVファイルの取得

まずは使うデータを持ってくるために,楽天証券のページ上で実現損益のデータをCSVで取得する.
この辺の操作は私が参考にしたページで確認してほしい.
Pythonの基礎も知らない超初心者が、楽天証券の実現損益データをPythonでグラフ化してみた
簡単に言うと,楽天証券に入って,口座管理 > 損益・税金履歴 > 実現損益 を開いて,CSV形式で保存する.ファイル名はソースコードに合わせてtrade.csvにしておく.

参考にしたページでは「object型」から「int型」への変換がどうしてもできなかったと書いてあるが,AIで解決する.

Geminiに頼んで作ってもらう

Google Colaboratoryを開いて,Geminiに聞く.プロンプトは「CSVファイルを読み込んで,銘柄ごとの実現損益の合計を求めて」とかだったと思う.もともとExcelでまとめていた投資日記と値がずれていないかを確かめるために,可視化の前に一旦銘柄ごとのそんえき出力している.また,実現損益は税金でもっていかれる約2割を考慮していないが,そこは自分が使いやすいように税引き後に調整して以下.

銘柄ごとの税引き後損益を求めるコード

import pandas as pd

# CSVファイルの読み込み
file_path = 'trade.csv'
df = pd.read_csv(file_path, encoding='shift_jis')

# 実現損益を数値に変換(エラー時にはNaNに変換)
df['実現損益[円]'] = pd.to_numeric(df['実現損益[円]'].str.replace('', '').str.replace(',', ''), errors='coerce')

# 銘柄ごとの実現損益の合計と最終約定日を計算
def calculate_adjusted_profit(profit):
    if profit > 0:
        return profit * 0.79685
    else:
        return profit

result = df.groupby(['銘柄コード', '銘柄名']).agg(
    total_profit_loss=('実現損益[円]', lambda x: x.apply(calculate_adjusted_profit).sum()),
    last_trade_date=('約定日', 'max')
).reset_index()

# 銘柄ごとの損益の合計を求める
total_profit_loss_sum = result['total_profit_loss'].sum()

# 銘柄ごとの結果の表示
print("個々の銘柄の実現損益合計(税引き後):")
print(result)

print(f"\n全銘柄の実現損益の合計: {total_profit_loss_sum}") 

参考にしたページで可視化していたのでついでにGeminiに頼んでみた.
可視化のためのコード

import pandas as pd
import matplotlib.pyplot as plt

# CSVファイルの読み込み
df = pd.read_csv('trade.csv', encoding='shift_jis')

# '実現損益[円]' 列の値をクリーンアップし、数値に変換
df['実現損益[円]'] = pd.to_numeric(df['実現損益[円]'].str.replace('[^0-9.-]', '', regex=True), errors='coerce')

# NaNを除外
df = df.dropna(subset=['実現損益[円]'])

# 税引き後損益を計算する関数
def calculate_adjusted_profit(profit):
    if profit > 0:
        return profit * 0.79685
    else:
        return profit

# '実現損益[円]' 列に税引き後損益を適用
df['実現損益[円]'] = df['実現損益[円]'].apply(calculate_adjusted_profit)

# 約定日をdatetimeオブジェクトに変換
df['約定日'] = pd.to_datetime(df['約定日'])

# 月ごとに集計
monthly_df = df.resample('ME', on='約定日')['実現損益[円]'].sum().cumsum()

# グラフのサイズとアスペクト比を指定
fig, ax = plt.subplots(figsize=(8, 4))  # 横長に設定 (幅12, 高さ4)

# 累積損益をプロット
monthly_df.plot(ax=ax) # axを指定

# 軸ラベルとグリッドを設定
ax.set_xlabel("Date", size="12")
ax.set_ylabel("Cumulative profit/loss", size="12")
ax.grid(True)

# 縦軸の範囲を設定
ax.set_ylim(0)  # 最低値を0に設定

# 余白を調整
plt.tight_layout()

# グラフを表示
plt.show()

自分の売買データを可視化するとこんな感じ.

最初に儲けたあと1年ほど投資から離れていたことや2024年末に初めての損出しをして下がっていること,2025年の最初は調子がいいことが一目瞭然.

参考文献

この記事は以下の情報を参考にして執筆しました.

2
4
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
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?