【投資】10分でできる! Firstrade証券の確定申告 (+損益のグラフ化)

※2024年度 対応確認済み
※(2024/3/14) 配当課税の計算方法を修正
※(2024/5/6) Google Colabシステム変更へ対応

(確定申告に必要な「円ベースの損益計算」まで無料で読めますが、投げ銭いただけると励みになります)     

Firstrade証券は取引手数料が無料なのが魅力ですが、確定申告の際は取引ごとに損益、配当を円換算して合計する必要があります。
手数料無料のためついつい何度もトレードしがちですが(私の場合は去年700回🤯)確定申告を手計算しようとするとかなり面倒になります。売買日時ごとに為替レートを損益に掛け算しないといけないためです。

今回計算を自動化する方法を確立しましたので共有します(無料)。Googleアカウントさえあれば誰でもできます。
またおまけとして、銘柄ごとの損益や、確定損益推移のグラフ化、勝率や最大損失・収益などの統計情報を出す方法も公開しました(100円)。

トミィ (@toushi_tommy)さんという方がdiscordで無料のプログラミングサークルを主催されているのですが、そこで学んだ知識が役立っています。
この場をお借りしてお礼申し上げます。

手順

①Firstrade証券のHPでエクセルファイルをダウンロード

ログインして2つのcsvファイルをダウンロードします。

<1つ目>
(売買の損益計算に必要) 


<2つ目>
(配当計算に必要)


②ファイルをGoogle driveに入れる

どこでも結構ですが、専用のフォルダを作ってまとめてアップロードするのがおすすめです。
Google driveを使用したことがない方は例えば下記サイトを参照ください。


③Google Colabratory (Googleの無料サービス)でプログラムをコピペして実行

メインの作業内容になります。
使ったことがない方は敷居が高く感じるかもしれません。
手順自体は少ないため、多くの方は問題なくできるとは思いますが、
うまくいかない方はコメント欄にお願いします。
暇だったら対応します(^^;) 

Google Colabratory未使用の方はGoogle drive上で設定が必要です。
下記動画などを参考にして設定してください。


  • 準備が出来たら下記作業を行ってください。
    プログラムの実行が終わると、計算結果が出力されます
    作業】 
     ・Gooble colab上でファイルを作成
     ・下記プログラムをコピペ
     ・②のcsvファイルのフォルダパス、2つのcsvファイルのファイル名を
      プログラムの指定箇所(一番上)に記入
     ・プログラムを実行
      (実行後google driveへの接続が求められるので処理する)
      ⇒ 損益、配当のcsvファイルが上記フォルダに
        出力される

※ なお為替レートはyahoo financeの終値を使用しています

↓ プログラム(2023年度版)

 #Python 
###############################################################
# ↓ フォルダとファイル名を記入してください
ROOT = r"/content/drive/MyDrive/Colab Notebooks/確定申告" # csvファイルが置いてあるフォルダ /content/drive/以下にgoogle driveのフォルダを記入
CSV_PATH = 'FT_GainLoss_xxxxxxx.csv' # 損益計算用 csvファイル名
DIV_CSV_PATH = 'FT_CSV_xxxxxxx.csv' # 配当計算用 csvファイル名
# ↑
###############################################################

import os
import sys

from google.colab import drive

drive.mount('/content/drive')

os.chdir(ROOT)

!pip install japanize_matplotlib
!pip install yfinance==0.1.70
!pip install pandas==2.0.3
!pip install pandas_datareader==0.10

import japanize_matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pandas_datareader import data as pdr
import datetime
import yfinance as yf 


df = pd.read_csv(CSV_PATH, header=1).drop(['Net Gain/Loss','% Gain/Loss','Wash Sales'],axis=1)
df = df.iloc[:-3]


price_columns = ['Sales Proceeds', 'Adjust Cost']
for price_column in price_columns:
    df[price_column] = df[price_column].str.replace('$','').str.replace(',','').astype('float32')


date_columns = ['Date Acquired','Date Sold']
for date_column in date_columns:
    df[date_column] = pd.to_datetime(df[date_column])


start = "2020-1-1" #@param {type:"string"}
end = datetime.date.today()
ticker = 'JPY=X' #@param [""] {allow-input: true}

yf.pdr_override() # <== that's all it takes :-)
currency_convert_table = pdr.get_data_yahoo(ticker, start, end)['Close'].astype('float32')

rate_columns_dict = {
    'Date Acquired' : 'buy date ex rate',
    'Date Sold' : 'sell date ex rate'}
for key,value in rate_columns_dict.items():
    print(key)
    df[value] = currency_convert_table[df[key]].values

price_columns_dict = {
    'Sales Proceeds' : 'Sales Proceeds (Yen)',
    'Adjust Cost' : 'Cost (Yen)'}
for daller, date in zip(price_columns_dict.keys(), rate_columns_dict.keys()):
    df[price_columns_dict[daller]] = df[daller] * df[rate_columns_dict[date]]

    df[price_columns_dict[daller]] = df[price_columns_dict[daller]].apply(lambda x: int(x))



price_list = list(price_columns_dict.values())
buy = price_list[0]
sell = price_list[1]
df['profit and loss (Yen)'] = df[buy] - df[sell]

df_ticker_profit_loss = df.groupby(by='Symbol').sum(numeric_only=True).sort_values('profit and loss (Yen)', ascending=False)
df_ticker_profit_loss = df_ticker_profit_loss.iloc[:, -3:].reset_index()
df_ticker_profit_loss = df_ticker_profit_loss.rename(columns={
    'Symbol' : '銘柄',
    'Sales Proceeds (Yen)':'譲渡による収入金額(円)',
    'Cost (Yen)':'必要経費又は譲渡に要した費用等(円)',
    'profit and loss (Yen)': '損益(計算)(円)'
})

label = df_ticker_profit_loss['銘柄']
if len(label) == 0:
    print('確定損益の発生が見当たらないため、銘柄ごとの配当金_グラフは表示されません')
else:
    x_len = len(label) // 6  + 7
    x_tick_size = len(label) // 30 + 11


df_div = pd.read_csv(DIV_CSV_PATH, header=0).drop(['Price','Commission','Fee','CUSIP','RecordType'],axis=1)
df_div = df_div[df_div['Action'] == 'Dividend']

if len(df_div) == 0:
    print('配当金の受け取りが見当たらないため、銘柄ごとの配当金_グラフは表示されません')
    annual_div = 0
else:
    # 円換算
    df_div['rate'] = currency_convert_table[df_div['SettledDate']].values
    df_div['(7)収入金額'] = df_div['Amount'] * df_div['rate']
    df_div['(7)収入金額'] = df_div['(7)収入金額'].apply(lambda x: int(x))

    # 配当金合計
    annual_div = df_div['(7)収入金額'].sum(numeric_only=True)

    # 銘柄ごと
    df_div_ticker = df_div.groupby('Symbol').sum(numeric_only=True).sort_values('(7)収入金額', ascending=False)

    # 合計を末尾に追加
    df_div_ticker.loc['合計'] = annual_div
    
    df_div_ticker = df_div_ticker.drop(['Quantity','Amount','Interest','rate'],axis=1)
    df_div_ticker = df_div_ticker.reset_index().rename(columns={'Symbol':'銘柄'})

    # 税金計算
    gensen_ratio = 0.15315
    haitouwari_ratio = 0.05
    gaikokuzei_ratio = 0.1

    df_div_ticker['(10)通知外国税相当額'] = df_div_ticker['(7)収入金額'] * gaikokuzei_ratio
    df_div_ticker['(8)源泉徴収税額'] = (df_div_ticker['(7)収入金額'] - df_div_ticker['(10)通知外国税相当額']) * gensen_ratio
    df_div_ticker['(8)未納付の源泉徴収税額'] = 0
    df_div_ticker['(9)配当割額控除額'] = (df_div_ticker['(7)収入金額'] - df_div_ticker['(10)通知外国税相当額']) * haitouwari_ratio
    df_div_ticker.iloc[:,1:] = df_div_ticker.iloc[:,1:].applymap(int)

    # 表保存
    df_div_ticker.to_csv('【確定申告用】銘柄ごとの配当金.csv',index=False, encoding='utf-8_sig')


# 損益、配当合計のみ出力
profit_loss_yen_sum = df_ticker_profit_loss.iloc[:,1:].sum(axis=0)
pd.DataFrame(profit_loss_yen_sum).T.to_csv('【確定申告用】売買損益合計.csv',index=False,encoding='utf-8_sig')



銘柄ごとの損益や、確定損益推移のグラフ化、勝率や最大損失・収益などの統計情報を出す方法


下図のような出力が可能です。

銘柄ごとの年間損益(円)
損益推移(円)
銘柄ごとの配当金
統計情報


こちらのプログラムは有料になります。
内容としては 上の内容の出力 + コメントによる説明付きのプログラム  になります。
コメントによる説明がついていますので、ご自身でプログラムをいじりたい方には多少参考になるかもしれません。


ここから先は

7,395字

¥ 100

この記事が気に入ったらサポートをしてみませんか?