「Jupyter Notebook」楽天証券の取引履歴CSVから確定申告の「有価証券の内訳書」を集計する備忘録

# この記事は

また来年も「有価証券の内訳書」を作成するときに使うための備忘録。
（もしニーズがあるようならライブラリに）

# やりたかったこと

出来るだけ手作業はしたくなかった

# やり方

楽天証券の、マイメニュー > 口座管理 > 取引履歴からCSVをダウンロード

![Screen Shot 2023-05-28 at 17.51.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179979/a24ce8cf-12c4-ba6c-55f2-92a5b1d28046.png)

```python
%load_ext nb_black

import numpy as np
import pandas as pd
import glob
import datetime as dt
```
## 国内株式

```python
columns = [
    "約定日",
    "受渡日",
    "銘柄コード",
    "銘柄名",
    "市場名称",
    "口座区分",
    "取引区分",
    "売買区分",
    "数量［株］",
    "単価［円］",
    "手数料［円］",
    "税金等［円］",
    "諸費用［円］",
    "税区分",
    "受渡金額［円］",
]

files = glob.glob("*JP*.csv")
csv = []

for filename in files:
    df = pd.read_csv(
        filename,
        encoding="cp932",
        usecols=columns,
        thousands=",",
        parse_dates=["約定日", "受渡日"],
    )
    csv.append(df)

jp_df = pd.concat(csv, axis=0, ignore_index=True)
```

## 米国株式

```python
columns = [
    "約定日",
    "受渡日",
    "ティッカー",
    "銘柄名",
    "口座",  # 20220417
    "取引区分",
    "決済通貨",
    "数量［株］",
    "単価［USドル］",
    "約定代金［USドル］",
    "為替レート",
    "手数料［USドル］",
    "税金［USドル］",
    "受渡金額［USドル］",
    "受渡金額［円］",
]

csv = []
df = pd.read_csv(
    "US1.csv",
    encoding="cp932",
    usecols=columns,
    thousands=",",
    parse_dates=["約定日", "受渡日"],
)
csv.append(df)

df = pd.read_csv(
    "US2.csv",
    encoding="cp932",
    usecols=columns,
    thousands=",",
    parse_dates=["約定日", "受渡日"],
)
csv.append(df)
```


```python
df = pd.concat([jp_df, us_df], axis=0, ignore_index=True)
converted_df = df

trim_hyphens = ["受渡金額［USドル］", "受渡金額［円］", "税金［USドル］", "約定代金［USドル］", "手数料［USドル］"]
for x in trim_hyphens:
    converted_df[x] = np.where(df[x] == "-", 0, df[x])

converted_df["売買区分"] = np.where(df["売買区分"] != df["売買区分"], df["取引区分"], df["売買区分"])
casts = ["受渡金額［USドル］", "約定代金［USドル］", "受渡金額［円］", "税金［USドル］", "手数料［USドル］"]
for x in casts:
    converted_df[x] = df[x].str.replace(",", "").astype(float)

converted_df["受渡金額［円］"] = np.where(df["売買区分"] == "売付", -df["受渡金額［円］"], df["受渡金額［円］"])
converted_df["受渡金額［USドル］"] = np.where(
    df["売買区分"] == "売付", -df["受渡金額［USドル］"], df["受渡金額［USドル］"]
)
converted_df["数量［株］"] = np.where(df["売買区分"] == "売付", -df["数量［株］"], df["数量［株］"])
converted_df.info()
```

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 191 entries, 0 to 190
    Data columns (total 23 columns):
     #   Column      Non-Null Count  Dtype         
    ---  ------      --------------  -----         
     0   約定日         191 non-null    datetime64[ns]
     1   受渡日         191 non-null    datetime64[ns]
     2   銘柄コード       81 non-null     float64       
     3   銘柄名         191 non-null    object        
     4   市場名称        81 non-null     object        
     5   口座区分        81 non-null     object        
     6   取引区分        188 non-null    object        
     7   売買区分        191 non-null    object        
     8   数量［株］       191 non-null    int64         
     9   単価［円］       81 non-null     float64       
     10  手数料［円］      81 non-null     float64       
     11  税金等［円］      81 non-null     float64       
     12  諸費用［円］      81 non-null     float64       
     13  税区分         81 non-null     object        
     14  受渡金額［円］     191 non-null    float64       
     15  ティッカー       110 non-null    object        
     16  決済通貨        110 non-null    object        
     17  単価［USドル］    110 non-null    object        
     18  約定代金［USドル］  110 non-null    float64       
     19  為替レート       110 non-null    object        
     20  手数料［USドル］   110 non-null    float64       
     21  税金［USドル］    110 non-null    float64       
     22  受渡金額［USドル］  110 non-null    float64       
    dtypes: datetime64[ns](2), float64(10), int64(1), object(10)
    memory usage: 34.4+ KB


## 期末残高の出力


```python
converted_df[converted_df["約定日"] < dt.datetime(2021, 3, 31)].groupby(
    "銘柄名"
).sum().sort_values("数量［株］", ascending=False).to_csv("term_end.csv")
```

## 期中増(減)の明細出力


```python
converted_df[
    (converted_df["約定日"] > dt.datetime(2020, 4, 1))
    & (converted_df["約定日"] < dt.datetime(2021, 3, 31))
][["約定日", "銘柄名", "売買区分", "数量［株］", "受渡金額［円］", "受渡金額［USドル］"]].sort_values(
    ["銘柄名", "約定日"]
).to_csv(
    "transactions.csv" # 手動で受渡金額［円］の正負反転が必要
)
```