為替データを自動で取得する

当社では外国通貨の取引が多く、為替変動が収益に大きく左右します。

頻繁に為替動向をチェックしていますが、webより自動でデータを取得したいと思います。

サイトはYahoo Financeを利用します。
https://info.finance.yahoo.co.jp/history/?code=USDJPY

 

サイトの赤丸の欄に開始日と終了日を入力すると毎日の為替データが表示されます。

この日付指定をインプットボックスで行い、指定した期間の為替データを自動で取得してCSVファイルに保存するところまでやっていきます。

現在、CSVファイルが次のパスにあります。

ファイルには次のようにデータが自動で入ります。

 

 

それではさっそくはじめましょう。

さきほどのURLにアクセスして、開始日を2020年2月27日に指定し、終了日を2020年5月27日に指定すると、次のように4ページに分かれて毎日の為替データが表示されます。

これからやりたいことは、このそれぞれのページからデータを抽出してCSVファイルへ書き込みます。

指定した期間のデータが1ページで表示されていれば、ひとつのURLを分析すればよいのですが、いくつもページが分かれているためページごとにURLが異なっています。

よって、その4ページ分のURLをひとつのリストに入れて、for 文でそれぞれ抜き出しデータを抽出していきます。

手順

1.URLリストを作成する。
  それぞれのページをリスト(URL)に入れていきます。

2.データリストを作成する。
  リスト(URL)から1ページづつ抽出し、ページに表示されている為替データ
  をデータリスト(USD_price)に入れていきます。

3.CSVファイルへ書き出す。
  データが格納されたリスト(USD_price)からCSVファイル 
  (ForeignExchange_rate_USD.csv)へ書き出していきます。

 

手順1. URLリストを作成する

4ページそれぞれのURLは次のようになっています。

https://info.finance.yahoo.co.jp/history/?
code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=1 

https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=2

https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=3

https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=4

これをひとつのリストに入れていきます。

出来上がりは次のようになります。

['https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=1', 'https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=2', 'https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=3', 'https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=4']

このurlを見てみると日付が指定されていることに気づきます。

https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d

この部分に自由に数字をインプットできるようにすればよく、次のようにインプットボックスで開始日と終了日を指定できるようにします。

 

コード1

# インプットボックスで日付を指定します。・・①
symd = input(“スタート日を入力してください(例:2020/1/1)>”)
eymd = input(“最終日を入力してください(例:2020/12/31)>”)

# 日付を分割して変数へ入れます。・・②
SYMD = symd.split(“/”)
sy, sm, sd = SYMD

EYMD = eymd.split(“/”)・・③
ey, em, ed = EYMD

# urlを作成します。・・④
url = “https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy={}&sm={}&sd={}&ey={}&em={}&ed={}&tm=d”.format(sy,sm,sd,ey,em,ed)

 

 

ここで、コードの意味を確認しておきます。

yahoo Financeのページで、2020年2月27日から2020年5月27日のデータを取得して見ると4 ページに分かれて表示されます。

それぞれのurlは次の通りです。

1ページ目
https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=1

2ページ目
https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=2

3ページ目
https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=3

4ページ目
https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=4

それぞれのページを見比べてみると最後の” &p=〇 ” の部分だけ違っていて〇にはページ数が入っています。

次に共通部分を確認してみます。
https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d

日付の指定を2020年2月27日から2020年5月27日までしましたので、このurlから次のように推測されます。

sy=開始年
sm=開始月
sd=開始日

ey=終了年
em=終了月
ed=終了日

よって、それぞれの年、月、日にインプットボックスから指定した値が入るように設定します。

① 次のようにデータを取得する期間の開始日と終了日を、インプットボックス
  から取得して変数へ代入します。

  symd = input(“スタート日を入力してください(例:2020/1/1)>”)
  eymd = input(“最終日を入力してください(例:2020/12/31)>”)

次に、変数へ入った年月日を年、月、日に分割してそれぞれ変数へ代入します。

② 開始日を変数へ代入します。
  SYMD = symd.split(“/”)
  sy, sm, sd = SYMD

  symdの変数には「2020/2/27」が代入されています。
  split(“/”)で  [‘2020’, ‘2’, ’27’]  と年、月、日が区分されSYMD変数へ代入され
  ます。

  sy,sm,sd=SYMDにより
  syには’ 2020′ が入り、sm には’ 2 ‘ が入り、sd には’ 27 ‘が入ります。

③ 次に、終了日を変数へ代入します。
  EYMD = eymd.split(“/”)
  ey, em, ed = EYMD

  eymdの変数には「2020/5/27」が代入されています。
  split(“/”)で  [‘2020’, ‘5’, ’27’]  と年、月、日が区分されEYMD変数へ代入され
  ます。

  次に、ey,em,ed=EYMDにより
  eyには’ 2020′ が入り、em には’ 5 ‘ が入り、ed には’ 27 ‘が入ります。

④ 年、月、日が変数に入りましたので、これら変数をurlにフォーマットして
  urlを作成します。

url = “https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy={}&sm={}&sd={}&ey={}&em={}&ed={}&tm=d”.format(sy,sm,sd,ey,em,ed)

 

print(url)で次のように確認ができます。

https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d

これで日付を指定したURLが取得できました。

これをコードに指定して、requestsでダウンロードしBeautifulSoupで解析してそれぞれのページのURLを取得していきます。

それでは、次のコードを書いていきます。

コード2

r = requests.get(url) #①
soup = BeautifulSoup(r.content, “html.parser”) #②
ul_elems = soup.select(“ul.ymuiPagingBottom”) #③
a_elems = ul_elems[0].select(“a”) #④

URL = [] #⑤
URL.append(url) #⑥

for elem in a_elems: #⑦
    if elem.getText() != “次へ”: #⑧
        href = elem.get(“href”) #⑨
        URL.append(href) #⑩

print(URL)

['https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d', 'https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=2', 'https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=3', 'https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=4']

 

コードの意味を説明していきます。

①  webサーバーからHTMLファイルをダウンロードします。

② BeautifulSoup()のかっこ内に「HTMLファイルの内容」と「パーサー
  を指定し、その結果をsoup変数に代入しておきます。
      HTMLファイルの内容」は、requestsモジュールでダウンロードした結果か 
     ら.contentで取得できます。

③  ul要素(リスト要素)を取得して変数へ代入します。

 

ページの「1」のところで右クリックをして「検証」をクリックすると次のようにコードが表示されます。

 

これによると、ページ番号のリンクはul要素内の3つのa要素に相当することが分かります。そこで、まずul要素をclass属性の値(ymuiPagingBottom)で特定し、そこからa要素(リンク要素)を取得します。

select()メソッドによる要素の検索では、id属性とclass属性を検索条件に付加することができます。以下のように、「id属性の値」は「#」の後に、「class属性の値」は「.」の後に付け加えます。

<ul class=”ymuiPagingBottom clearFix”>
となっていますので、 
soup.select(“ul.ymuiPagingBottom“)
と指定します。

④ ul要素(リスト要素)からa要素(リンク要素)を取得して、変数a_elemsへ代入します。

⑤ すべてのページのURLを格納するリスト(URL)を作ります。

⑥ ul要素を見ると、1ページ目のURLがありませんので、1ページ目のURLをリストに入れておきます。
1ページ目のURLは、「コード1」で取得した次のURLになります。

url = “https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy={}&sm={}&sd={}&ey={}&em={}&ed={}&tm=d”.format(sy,sm,sd,ey,em,ed)

⑦ ④で取得したa要素が格納されているa_elemsからひとつづつa要素を抽出し
        て変数elemへ代入します。

⑧ 変数elemに代入されたa要素を読み取っていきます。
       要素の内容を読み取るには、取得した要素からgetText()を呼び出します。

⑨ a要素からhref属性の値を読み取り、変数hrefへ代入します。
  (href属性はリンク先の場所を示します。)
  このとき「次へ」のa要素は除外します。

⑩ 変数hrefへ代入されたURLをリスト(URL)へ格納します。

  次に⑦へ戻って次のa要素からhref属性を読み取りURLリストへ格納してい
       きます。

      すべてのa要素からhref属性を読み取りリストに格納されると、URLリストは
  次のようになります。

['https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d', 'https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=2', 'https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=3', 'https://info.finance.yahoo.co.jp/history/?code=USDJPY%3DX&sy=2020&sm=2&sd=27&ey=2020&em=5&ed=27&tm=d&p=4']

これで、すべてのページのURLがひとつのリストにまとまりました。

次から、このそれぞれのURLに表示されている為替データを抽出してひとつのリストにまとめていきます。

手順2 データリストを作成する。

リスト(URL)から1ページづつ抽出し、ページに表示されている為替データをデータリスト(USD_price)に入れていきます。

まずはコードから見ていきます。

コード3

# データをリストに入れていく
USD_price = []  #  ①
for url in URL:  # ②

    # HTMLファイルのダウンロード
    r = requests.get(url)   # ③

    # Beautiful Soup
    soup = BeautifulSoup(r.content, “html.parser”) # ④

    # table要素の取得
    tables = soup.select(“table.boardFin”) # ⑤

    # tr要素の取得
    rows = tables[0].select(“tr”) # ⑥

    # 各行のデータを抽出
    data_list = []      # ⑦
    line_num = 0        # ⑧

    for row in rows:        # ⑨
        line_num = line_num + 1     # ⑩

        # 先頭行を飛ばす
        if line_num < 2:   # ⑪
            continue

        cells = row.select(“th,td”)  # ⑫
        values = []         # ⑬

        for cell in cells:     # ⑭
            values.append(cell.getText()) # ⑮

        # 対象データ
        datas = (values[0], values[1], values[2], values[3], values[4])  # ⑯
        data_list.append(datas)   # ⑰

    # 確認
    for data in data_list:    # ⑱
        USD_price.append(data) # ⑲

print(USD_price)


[('2020年5月27日', '107.520000', '107.940000', '107.350000', '107.710000'), ('2020年5月26日', '107.690000', '107.920000', '107.390000', '107.520000'), ('2020年5月25日', '107.570000', '107.770000', '107.540000', '107.690000'), ('2020年5月22日', '107.590000', '107.760000', '107.300000', '107.610000'), ('2020年5月21日', '107.480000', '107.840000', '107.460000', '107.610000'), ('2020年5月20日', '107.690000', '107.980000', '107.320000', '107.510000'), ('2020年5月19日', '107.310000', '108.080000', '107.280000', '107.680000'), ・・・・・・・・・・・・・]

では、ひとつづつ説明していきます。

① これから取得する為替データを格納するリストを作成します。

② 変数URLに入ったURLリストからひとつづつURLを抽出して変数urlへ代入
       します。

③ webサーバーからHTMLファイルをダウンロードして、変数rへ代入しま
  す。

④ 変数rへ代入されたurlをBeautifulSoupで読み込み、「HTMLファイルの内
        容
」と「パーサー」を指定し、その結果をsoup変数に代入します。

⑤ テーブル要素を取得して変数へ代入します。

    webサイトの表の中で右クリックして「検証」をクリックします。

コードの次の箇所にカーソルを合わせると表が選択されることから、次のコードが表の位置を示していることがわかります。

<table width=”100%” border=”0″ cellspacing=”0″ cellpadding=”0″ class=”boardFin yjSt marB6″><tbody><tr>

table要素を取得して変数(tables)へ代入します。

table要素はいくつもあるので、特定するためにclass属性の「boardFin」で取得します。

⑥ 取得したtable要素から、「tr」要素を取得します。
  tr要素は表の「行」の要素です。
  すなわち、指定したtable要素の中から行を取得することになります。
  このホームページにはclass属性が「boardFin」のtable要素は1つしかない
        ので、tables[0]になります。

⑦ これよりデータを取得していきます。
  まず、データを格納するリスト(data_list)を作成します。
 
⑧ この表の先頭行は項目ですので、データ取得は2行目からになります。
  その行数をカウントする変数をline_numとし、0を入れておきます。
 
⑨ 取得した全行(rows)から1行づつ抽出して変数(row)に代入します。
 
⑩ そのとき、行数を1カウントします。
 
⑪ 行数が2未満ならば処理せず飛ばします。(1行目の項目行を飛ばす)
 
⑫ 変数rowに代入された1行分から「th」要素と「td」要素を取得して変数
 (cells)へ代入します。
 
tr要素の中には、セルに相当するth要素とtd要素が配置されています。th要素には<th> ~ </th>で見出し(ヘッダー)を囲みます。td要素には<td> ~ </td>でデータを囲みます。
 
⑬ 変数cellsからデータを取得して蓄積していくためvaluesリストを作成しま
       す。
 
⑭ 全行分のtd,th要素を格納した変数cellsをループ処理して、1データずつ
  身を取り出します。
 
⑮ 要素の内容をgetText()メソッドで読み取り、valuesリストへ格納します。
 
⑯ valuesリストに格納されたデータのうち、1番目から5番目のデータを取得し
       て変数datasへ代入します。
 
⑰ 変数datasへ代入されたデータをリスト(data_list)へ格納します。
        data_listには1ページ分のデータが格納されます。
 
⑱.⑲ 1ページ分のデータがdata_listへ格納されるので、そのデータを
         USD_priceリストへ放り込みます。
 
1ページ分のデータがUSD_listへ格納されたら②へ戻り次のページの処理をします。そしてすべてのページのデータがUSD_priceリストへ格納されたら終了です。
 
USD_priceは次のようになります。
  
[(‘2020年5月27日’, ‘107.520000’, ‘107.940000’, ‘107.350000’, ‘107.710000’), (‘2020年5月26日’, ‘107.690000’, ‘107.920000’, ‘107.390000’, ‘107.520000’), (‘2020年5月25日’, ‘107.570000’, ‘107.770000’, ‘107.540000’, ‘107.690000’), (‘2020年5月22日’, ‘107.590000’, ‘107.760000’, ‘107.300000’, ‘107.610000’), (‘2020年5月21日’, ‘107.480000’, ‘107.840000’, ‘107.460000’, ‘107.610000’), (‘2020年5月20日’, ‘107.690000’, ‘107.980000’, ‘107.320000’, ‘107.510000’), (‘2020年5月19日’, ‘107.310000’, ‘108.080000’, ‘107.280000’, ‘107.680000’), ・・・・・・・・・・・・・]

手順3.CSVファイルへ書き出す

データが格納されたリスト(USD_price)からCSVファイル 
  (ForeignExchange_rate_USD.csv)へ書き出していきます。

 

コード4

# CSVファイルへ保存する
from pathlib import Path
import csv

# CSVファイルに保存
dld_dir = Path(“./RPA”)  # ①
file_path = dld_dir / “ForeignExchange_rate_USD.csv”  # ②

with file_path.open(mode=”w”, encoding=”cp932″, newline=””) as f: # ③
    writer = csv.writer(f)    # ④

    # ヘッダー
    writer.writerow([“日付”, “始値”, “高値”, “安値”, “終値”]) # ⑤

    # データ書き込み
    for data in USD_price: # ⑥
        writer.writerow(data) # ⑦

① CSVファイルが保存されているディレクトリ(RPA)をdld_dir変数へ代入し
  ます。

② そのディレクトリ変数を利用して、CSVファイルのパスをfile_path変数へ
  代入します。

③ CSVファイルを開きます。
  mode=”w”でファイルを開きます。
  open()のかっこ内にnewline=””を加えます。
  (これを忘れると1行おきに空行が挿入されます。)
  書き込みモード(mode=”w”)でファイルを開くと、ファイルが存在しない
  場合は、新しいファイルが作成されます。ファイルがすでに存在する場合
  は、上書きされます。

  mode=”w”を指定した場合はファイルの中身はになります。
  mode=”w”モードを指定した場合は、ファイルを開いただけで一度空の状態
  になるので注意が必要です。
  (mode=”a”を指定した場合は書き込み内容が追記されます。)

 「cp932」はMicrosoftがShift_JISを独自に拡張した文字コードです。
  日本語版のWindows環境ではShiftJISにしておいた方が無難ですので
 「cp932」を使用します。

④ CSVファイルに書き込みます。
  書き込む時はCSV用のライター(writerを作成します。
  csv.writer()のかっこ内にファイルを開いた時の変数fを指定すると作成でき
  ます。

⑤ ヘッダーを書き込みます。

⑥⑦ データが格納されているUSD_priceリストからデータを抽出して、
            writerowで1行づつ書き込んで行きます。
  

以上で終了です。

為替データを取得してファイルに書き込んだだけでは自動化の意味はあまりありませんが、このデータを分析・加工し、またグラフにしてパワーポイントに表示するところまで自動で仕上げれば、報告用の資料を作成する時間はだいぶ縮小されます。

中国子会社への貸付けマクロプルーデンス

日本の親会社と中国の子会社間で親子ローンをしました。

これにはかなり手間取りましたので、備忘禄として記録しておきます。

親子ローンをするには2つの方法があり「投注差モデル」と「マクロプルーデンスモデル」のどちらかを選択する必要があります。

「投注差モデル」とは

中国には外債に関する規制があります。

中国本土内の外資系企業が親子ローン等、中国本土外から行う資金調達を「外債」と呼び、中国当局から認められた枠(外債枠)内におさめる必要があります。

この外債枠の上限となるものを「投注差」とよび、次のように算出されます。

「投注差」 = 総投資額(「投資総額」) - 登録資本金(「注冊資本」)

総投資額とは、
企業設立の際に必要な資金(基本建設資金+運転資金)の総和を指します。
総投資額=登録資本金+借入金ということになります。

登録資本金とは、
中国では授権資本制度がないため、払込資本金額そのものとなります。

この投注差における借入限度額算出方法を「投注差モデル」といいます。

マクロプルーデンスについての調査内容

マクロプルーデンスモデルとは
投注差モデルに変わる新たな外債枠管理モデルで、外債枠としては
前年の純資産の2倍まで可能となります。

よって、当社では貸付方法を投注差モデルからマクロプルーデンスモデルに変更しました。

マクロプルーデンスモデル(親子ローン)に関する手続きの流れと必要書類は次の通りです。

1.親子ローン契約調印
2.外債登記・外債口座開設申請
3.外債登記証の発行
4.外債口座開設
5.親子ローン送金実行、外債口座への入金
6.外債の返済及び金利支払の申請及び送金

親子ローンの年間回数には制限はないが、その都度外為管理局への届出が必要。

親子ローンの期間は特に制限はなし。
元利金支払周期も3ヶ月、6ヶ月、12ヶ月、期限一括など任意の期間で可能。

借入と返済の通貨は同じである必要あり。

利息(親会社からみた受取利息)には源泉税が10%、増値税が6%かかる。

外債として外為管理局の許可が必要であり、契約締結後15日以内に外債登記の手続きを行う必要がある。

借入れた外貨を人民元に転換する際、外為管理局の許可が必要。

子会社から親会社へ元本返済、利息支払いの際、その都度外為管理局の許可が必要。

 

マクロプルーデンスについて実施記録

今回当社では、外債枠モデルを「投注差モデル」から「マクロプルーデンスモデル」へ変更しました。

実際のスケジュールは次の通り1か月かかりました。

2月22日 マクロプルーデンス届出書類完成

2月23日 マクロプルーデンス届出(中国外為管理局)

3月10日 親子ローン締結(親会社と子会社)

3月13日 親子ローン届出(中国外為管理局)

3月24日 マクロプルーデンス許可(届出より20営業日)

3月25日 入金

マクロプルーデンスモデルであれば、外債枠は純資産の2倍まで可能であり、投注差モデルの場合ではあと520,000 RMBほどしか枠がなかったものが、9,000,000 RMBほどに増えました。

しかし、このマクロプルーデンスモデルでの貸付には、中国において外為管理局へ届け出て承認をもらわなければなりません。

その承認に、20営業日ほどかかるため、申請してから約1ヶ月後ようやく現地中国で資金が使えるようになりました。

注意しなければならないのは、融資枠(外債枠)について加重残高という考えをし、次のように人民元の借入期間によって借り入れた金額が加重されます。

・人民元を2年で借入をする場合借入額×1
・人民元を半年で借入をする場合借入額×1.5
・外貨(USD,円など)で2年借入をする場合借入額×1.5
・外貨(USD,円など)で半年借入をする場合借入額×2

たとえば、借入額×1.5というのは、1,000,000 RMBを借りた場合1,500,000 RMBを借りたものとしてカウントされることを意味します。

 

三国間貿易の流れについて

中国と日本とインドにおいて3国間貿易をしています

お客様との販売交渉からはじまり、最終的に資金を回収してクローズするまでさまざまな活動と書類作成がありますので確認してみましょう

 

商流は上記のとおり、中国の子会社が中国のメーカーから商材を仕入れて、日本本社に販売します

日本の本社はそれをインドへ販売します

お金の流れは、日本本社はインドからUSD(アメリカドル)で販売代金を回収して、中国の子会社へRMB(人民元)で支払います

 

貿易における手続きは次の通りとなります

取引条件は

仕入は中国へ前払いにより行い、売上はインドよりBL発行後180日後回収としています

手続き説明

① 販売交渉
本社がインドの顧客と販売の交渉を行います
関連
販売価格の決定の仕方
円安になると得をするのか?損をするのか?の考え方

② 仕入交渉
販売交渉と同時に中国子会社が中国メーカーと価格交渉を行います

③ 販売・仕入報告
中国子会社より日本本社へ仕入価格の回答をします

④ インド顧客からPO受領
インド顧客へ正式な販売価格を伝えた後、POPurchase Order : 注文書)を発行

⑤ 日本本社から中国子会社へPO発行

⑥ 中国子会社から中国メーカーへPO発行

⑦ インド個客が開設銀行へLCを発行依頼

⑧ 開設銀行から買取銀行へLCを送付

⑨ 買取銀行から日本本社(輸出者)へLC通知

⑩ 日本本社から中国子会社へ代金支払

⑪ 中国子会社から中国メーカーへ代金支払

⑫ 中国子会社が海上輸送の手配

⑬ 海貨業者からBLを受領
BL(Bill of Lading:船荷証券)は、貿易における船積書類のひとつで、
船会社が輸出者の貨物を受け取ったときに発行される書類です

⑭ 中国子会社は受領したBLを日本本社へ郵送

⑮ 日本本社では受け取ったBLと船積書類を揃えて買取り銀行へ呈示

⑯ 買取銀行から代金を受け取る

⑰ 買取り銀行は手形・BL・船積書類を開設銀行へ送付し代金の取り立て依頼
をする

⑱ 開設銀行は船積書類をインド顧客(輸入者)へ引き渡す

⑲ インド顧客(輸入者)は、受け取った船積書類を船会社へ呈示して貨物を引き
取る

⑳ インド顧客(輸入者)は、支払期日に開設銀行へ代金を支払う

㉑ 開設銀行と買取銀行は銀行間決済を行う

 

以上がおおまかな流れとなりますが、手続きはスムーズにいかないことも多いです

海外取引には輸送に時間がかかるため、商品の引き渡しや代金決済にタイムラグが生じます

輸出者(売り手)、輸入者(買い手)の双方にリスクがありますが、取引を円滑に進めるため、L/C(信用状)を銀行に発行してもらいリスクを取ってもらうこともあります

そのL/C書類を作成するため厳格な決まりがあり、その書類作成に不備がある場合には商品の受け取りが遅れるということもありますので、しっかりとマニュアルを作成しておきたいところです

 

為替の評価替えにおいて知っておくべきこと

どれだけの為替リスクにさらされているかはエクスポージャーを確認します

そのエクスポージャーの算定にはまだ売上、仕入計上されていない受注残、発注残も含んで計算すべきことを先のブログでお伝えしました

為替リスクにさらされている量を認識する方法

今回は財務担当者が為替差損益を報告する際、気を付けるべきポイントをお話しします

次のような外貨建債権債務になっているとします

グレーは会計データより抽出し、点線は取引成立しているがまだ売上計上されていない受注残です

9月外貨建債権債務

為替の影響を見たいので、額は1$としています

この場合為替リスクにさらされているエクスポージャーは$1です

借方側が多いので1円円高になった場合には1円の為替差損が発生します

よって、次の図のように借入金を1$してこのエクスポージャーをゼロにしました

為替リスクをヘッジするには為替予約をする方法のほかに、外貨で借入金をする方法があります

外貨で借り入れたらすぐに円転することにより円転額で為替予約をしたものと同じ効果となります

当月の利益に与える影響

当社は月末に為替評価替えをしています
売上、仕入など外貨建の計上は月初の為替レートを利用しています

このように計上レートに利用するレートを社内レートとよび、計上するときの為替レートが月初より変動しても、計上は社内レート(月初のレート)で計上します

もう一度、先の図を見て下さい

借入金1$したことによりエクスポージャーはゼロとなりました

しかし、これには売上に計上されていない「受注残」が含まれていますが、実際の会計上のデータではないので月末の評価替えの際にはこの分の為替評価にはカウントされません

つまり、上の図では月末に評価替えするのはグレーの部分のみです

グレーの部分、つまり会計上のデータにおいては2$のエクスポージャーが発生していることになります

9月末の為替レートが110円と1円円高になっている場合、2円の為替差益が発生することになります

この為替差益は損益計算書上「営業外収益」の区分に表示されます

 

エクスポージャーがゼロなら為替差損益は発生しないはずなのに・・

実は、ここで発生した額と同額が粗利益(売上-仕入)に影響します

 

翌月の10月の為替ポジションは次の通りとなります
(10月の社内レート110円)

売掛金は、9月末には受注残であったものが10月に出荷されたことにより売上計上されますが、10月の社内レートが110円のため110円が簿価になります

売掛金 /  売上 の仕訳になり、外貨建て資産には借方に売掛金が計上されます

債権、債務、借入金は9月より引き続き残っているものであり、9月末の評価替え110円が簿価となっています

 

このまま、10月末も為替レートが110円と変わらないとした場合には為替差損益は発生しません

正確には、営業外損益としての為替差損益は発生しません

ここで注意すべきことは、売上高の計上が交渉時(9月)には111円であったものが、10月の社内レートにより110円となっていることです

9月の取引成立時は次の通りだったとします

売上:2$(値決めレート1$=111円)
仕入:222円(円建て)
利益:  0円

(為替の影響を見るため利益はゼロとして考えます)

これが10月の売上計上時には

売上:2$(社内レート110円×2$=220円)
仕入:222円(円建て)
利益: ▲2円

よって、10月の売上総利益は▲2円となります

 

損益は

9月に「営業外収益」2円
10月に「売上総利益」▲2円

となります

9月と10月を累計すれば為替リスクゼロですが、月がまたがって相殺されます

また、損益の出る区分が「営業外収益」と「売上総利益」と異なるため
利益が賞与や給与の業績評価になっている場合には大問題です

財務担当者は、10月の利益のマイナスは9月の営業外収益と相殺されることをちゃんと報告しなければなりません

為替差損益が業績評価の対象になっている場合に
”為替差益が出ているからだまっておこう”なんていう考えはだめですよ

営業担当の方も、このあたりの会計事情がわからないと、せっかく頑張ったのに評価されないことになりますのでしっかりと理解しておきましょう

 

為替リスクにさらされている量を認識する方法

為替リスクがどれくらいあるのかはエクスポージャー量を確認する必要があります

エクスポージャーとは外貨建資産勘定と外貨建負債勘定の差額をいいます

たとえば、外貨資産(例:ドル預金)を$1,000,000持っていたとします
1円円高になった場合には、1,000,000円の為替差損が発生します

$1,000,000の外貨負債(例:ドル借入)があった場合には1円円高により$1,000,000円為替差益が発生します

 

外貨資産と外貨負債を両方同じ量だけ持っていれば、外貨資産で発生する為替差損と外貨負債で発生する為替差益が相殺され為替リスクは発生しません

為替リスクにさらされるのは外貨建資産と外貨建負債の差でありこれをチェックしていけばよいことになります

 

ということで、次のように財務データから外貨建バランスシート(貸借対照表)を作成して、借方と貸方の差をまずチェックします

債権が100万ドルあり債務が80万ドルでしたので、その差額20万ドルがエクスポージャーということになり、この分が為替リスクにさらされています

そこで、次のように20万ドルの借入をしてエクスポージャーをゼロにしました

一応検証してみると次のようになります

ドルが111円から110円に1円円高になったとします

このとき、借方側(債権)では1円為替差損が発生します
貸方側(債務)では1円為替差益が発生します

これで安心・・

ではないんですね

先のデータは会計データから抽出しました

しかし、取引が成立してから会計データになるまでタイムラグがあります

会計データはつまり売上、仕入の計上ですが、売上、仕入が計上されるのは出荷基準の場合出荷されたときに会計データとして計上されます

よって、会計システムから外貨データを抽出するときには、既に取引が発生しているけれど売上、仕入計上されていないためデータとして反映されていない場合があります

これを受注残、発注残といい、次の図のようにこの分を含んでエクスポージャー量を確認する必要があります

30万ドルのエクスポージャーが発生してしまいました
借入金は20万ドルとしましたが、50万ドル必要だったんですね

 

そしてこうなりました

 

為替リスクヘッジはこれでできたことになります

 

財務担当者は、為替状況を上長に報告する必要がありますが
次回は、その際の注意点について考えてみたいと思います

特に、賞与や給与が利益で評価されている方はお読みください

為替の評価替えにおいて知っておくべきこと

 

子会社間による3国間貿易の為替リスクヘッジ

 

当社は中国からモノを仕入れてインドへ販売をする3国間貿易をしています

今回の事例をもとに、為替リスクヘッジについて考えてみたいと思います

取引状況

販売価格を1$として記します

 9月10日 取引成立
・販売価格 1USD(アメリカドル)・・値決めレート6.8RMB
・仕入価格 6.0 RMB(中国元)

 

中国子会社から中国メーカーへの支払日 9月30日
出荷予定日 10月2日(BL発行日)
インド顧客からUSD回収日 12月31日 (BL発行後90日)

 

図で示すと次のようになります

 

まずは、為替リスクを考えてみます

日本本社では、
中国子会社にUSDで支払いますが、インドからのUSD回収が3カ月になりますので、その間の為替リスクが発生します

中国子会社では、
日本本社から受けたUSDをRMBに転換する為替リスクが発生します

 

中国子会社の為替リスクヘッジ

中国子会社では日本本社よりUSDを受けて中国メーカーにRMBで支払います

USDを受ける日からRMBを支払うまでの間の為替リスクがありますので為替予約をします

 

日本本社の為替リスクヘッジ

次に、日本本社の為替リスクヘッジを考えてみます

中国メーカーに9月30日にRMBを支払った後、インド顧客からの回収は12月31日となり3カ月間の為替リスクを負わなければなりません

その間の為替リスクヘッジ方法として、まずは2つが考えられます

ひとつは、為替予約をする方法
もうひとつは、USDで借入をする方法です

為替予約は、本日1ドル111円とすると、12月31日に為替がどう動いていても111円で回収する方法です

しかし、この場合111円で回収できることはなく、すこし円高方向での回収となります(米国ドルと日本円の金利差分)

当社は、USDで借入をする方法で為替リスクをヘッジすることにしました

本日(9月10日)USDで販売価格と同額を借入をし、そのUSDを中国子会社への支払いに充てます

このとき日本本社のUSD建ての為替ポジションは次のようになっています

USD建ての債権と債務が一致していれば、今後為替がどう動いても為替リスクはありません

1円円高になった場合には、売掛金で1円為替差損が発生し、借入金で1円為替差益が発生します

逆に、1ドル112円の円安になった場合には、売掛金で1円為替差益が発生し、借入金で1円為替差損が発生します

 

要するに、同じ通貨の貸借対照表を考えて、借方の金額と貸方の金額の差で為替リスクが発生します

この差をエクスポージャーとよびます
たとえば、売掛金が2$あり、借入金が1$しかない場合には次のようになりエクスポージャー1$となります

この1$のエクスポージャーが為替リスクにさらされている部分です

たとえば、1円円高になった場合、この例では借方側で2円の為替差損が発生します

一方、貸方側では1円の為替差益が発生しますので、合計1円の為替差損となります

逆に、1円円安になった場合には、借方側では2円の為替差益が発生し、貸方側では1円の為替差損が発生しますので、合計1円の為替差益となります

 

早期払いで中国子会社の為替リスクをヘッジする

中国子会社ではUSDを受けてからRMBを支払うまでの間為替予約をしますが、
この期間がなければ為替予約をする必要もありません

であれば、日本本社からUSD入金があったらすぐ中国メーカーへRMBで支払ってしまえば為替予約をする必要がなくなります

よって9月13日に日本本社から中国子会社へUSDを支払い、中国子会社では即RMBに転換をして翌日14日に中国メーカーへ支払うことにしました

USDに対してRMBが元安予測であるならば、なるべく支払いを遅くした方がよいですが、元高リスクを排除したいのであればこのように支払いを早めることも有効です

 

為替リスク管理は四角い箱を作りましょう

四角い箱って何?

バランスシートを表現するには箱を描いてイメージします

どれくらいの為替リスクがあるのかを確認するには、外貨建のバランスシートの箱図を描いて借方と貸方のバランスをとります

当社の現在の外貨建てバランスシートは次のとおりです

 

このように借方の合計と貸方の合計が一致していれば、円高になっても円安になっても為替リスクはありません

1円円高になれば、借方は550万円の為替差損が発生しますが、貸方は550万円の為替差益が発生しますので相殺されてゼロですね

問題は、常に貸借のバランスがくずれて箱型がくずれてしまうことです

売上と仕入の両方が外貨建取引ならばよいのですが、

売上は円貨で仕入は外貨とか、売上は外貨だけど仕入は円貨の取引の場合、外貨建てバランスシートの箱型が崩れてしまいます

例)
商品を4千万円で仕入れて50万ドルで販売した場合には、売掛金50万ドルだけ外貨建てバランスシートに載ることになりこのようになります

借方の合計は600万ドルあり、貸方は550万ドルです

1円の円高で借方は600万円の為替差損が発生し、貸方は550万円の為替差益が発生します

よって、差引50万円の為替差損となります

常に外貨建てのバランスシートをチェックして箱型になっているか確認することが必要です

また、上記の図のように借入金がある場合には借入利息が発生しますので
外貨建ての債務を増やして借入金を圧縮することも必要ですね

今は、日本企業でも自由に外貨建ての取引ができます

これまで円貨で支払っていたものを外貨建てに変えるなど考えていかなければなりません

また、買掛金の支払のタイミングや借入金の返済のタイミングを売掛金の回収のタイミングと合わせることなども必要です

たとえば、外貨建ての債務を支払う時に、バランスシートでは外貨建て債権があってバランスはとれていたとしても、実際に支払う外貨のお金がなければ円を外貨に換えて支払うことになります

すると円を外貨に換えるレートと外貨建て債務計上レートの差で為替差損益が発生します

為替リスク管理では、外貨建てバランスシートの箱型をイメージするとともに、支払いのタイミングも考える必要があります

 

社内レートの違いで利益は変わるのか

社内レートは会社ごと決められると聞きました。

社内レートの決め方で、利益が変わってしまうのか疑問に思った新人と部長のやり取りです。

見てみましょう。

 

当社は日本の会社であるが、海外へ輸出したり、海外から輸入したりして外貨で商売をします。

また、日本の企業間でも外貨でやり取りする場合もあります。

 

外貨で受けたり、外貨で支払ったり、外貨のまま会計ができればよいのですが、必ず円に換算する必要があります。日本の会計の通貨単位は円が原則なんです。

 

外貨を円に交換するレートは日々変動しており、取引の都度、その日の為替レートで円に換算してもよいのですが、会計が煩雑になりますのでたいていは社内レートというものを使います。

 

社内レートの決め方はさまざまで、直近の一定日のレートや、過去一定期間の平均レートを使う場合やその月の初日のレートを使ったり、3ヶ月ごと、半月ごとなど、会社ごとに期間を定めて使用します。

 

しかし、社内レートはあくまでも便宜上のものであり、実際に取引をした時のレートと異なることは珍しくありません。

 

ここで疑問点が出てきます。

 

新人

社内レートは会社が決めるということは、その決め方によって計上する売上額または仕入額が変わってしまいますね。

 

部長

そうだね。

当社は毎月社内レートを定めていて、月の初めの為替レートがその月の社内レートになる。

同じ取引額で、同じ為替レートの時に取引を決めたとしても、異なる売上額を計上することになる。

 

たとえば、次のように取引額が同じで、その日の為替レートも同じものがあったとする。

4月10日(当日為替レート110円)売上高10万ドル

5月5日(当日為替レート110円)売上高10万ドル

 

しかし、4月1日の社内レートが105円、5月の社内レートが112円だっとしたら、
4月の売上は10,500,000円となり5月の売上は11,200,000円となる。

 

新人

それなら売上の場合、社内レートは円安の社内レートの月にあげた方が得になりますね。

 

部長

いや、そうはならないのだ。

 

会社はたいてい1年ごと決算がある。当社の決算は12月末だね。
決算時点での外貨建資産は、決算日の為替レートで換算し直す必要がある。

 

新人

では、決算日の為替レートが100円だとしたら、4月の売上は10,000,000ということになり500,000円減ってしまうのですか?

 

部長

いや、換算し直すのは、貸借対照表にあがる項目だけで、損益計算書の方は換算し直すことはない。

 

新人

では、売上は減ることはないのですね。安心しました!

 

部長

売上高は減ることはないが、何か忘れてないか?

売上高があがる時には、売掛金が一緒に計上される。
その売掛金は貸借対照表項目だから、決算日までに残っていればその日の為替レートで換算される。

そして、その差額は為替差損益という科目で決算上、損益計算書に載ることになるのだ。

 

たとえば、4月10日の売上と5月5日の売上が、両方決算日まで回収されずに売掛金として残っていた場合、

4月10日の売掛金は、10,500,000円 だが、決算日の為替レートは100円だから
換算し直して10,000,000円となる。

よって、500,000円の為替差損が計上されることになる。

 

一方、5月5日の売掛金は11,200,000円だが、決算日の為替レートは100円だから換算し直して、10,000,000円となる。

よって、1,200,000円の為替差損が計上されることになる。

 

決算時の損益計算書では次のようになるね。

4月10日の売上

売上高 10,500,000円

為替差損 500,000円

差引  10,000,000円

 

5月5日の売上

売上高 11,200,000円

為替差損 1,200,000円

差引  10,000,000円

 

結局、社内レートがいくらでも決算では最終利益は同じことになる。

 

部長

次のような図をイメージしておくとよいよ。

 

これより、社内レートの違いで最終利益はどう異なるかを見てみる。

次のように社内レートが異なる2つの取引がある。
どちらも、売掛金を回収した時の為替レートは105円で、
買掛金を支払した為替レートは100円とする。

①社内レート 112円(売上・仕入)
回収レート 105円
支払レート 100円

②社内レート 105円(売上・仕入)
回収レート 105円
支払レート 100円

 

①の場合

販売時の社内レートが112円のとき、

回収時の為替レートが105円だったら

112円で回収すべきところを、105円でしか回収できないのだから、損失になる。

 

加えて支払時の為替レートが100円だったら

 

買掛金は112円で支払うべきところ、100円で済んだのだから利益になる。

よって、売掛金の方で▲7円となり、買掛金の方で+12円だから、合計+5円となる。

 

②の場合

販売時の社内レートが105円のとき、

回収時の為替レートが105円だったら

105円で回収すべきところを、105円で回収したのだから損益はゼロとなる。

 

加えて支払時の為替レートが100円だったら

買掛金は105円で支払うべきところ、100円で済んだのだから利益になる。

 

よって、売掛金の方で±0円となり、買掛金の方で+5円だから、合計+5円となる。

 

①の場合も②の場合も、為替差損と為替差益の合計は+5で同じ。

わかったかな?

 

新人

はい、わかりました。

でも、前払金の取引がありますが、この場合どうなるのでしょうか?

部長

そうだね。中国との取引は前払金を支払って、翌月出荷になったりするね。

当社は出荷基準だから前払いをした月と出荷した月、つまり仕入計上する月が異なってしまう。

そこに為替差損益が発生してしまうね。

それは、また明日教えよう。

 

為替相場の種類

海外との貿易で活用される為替相場にはいくつか種類が存在します。

一般に海外取引先やグループ会社への資金送付には電信相場レート(TTS,TTBなど)が用いられますが、輸出入為替に関する為替銀行との決済についてはACC,A/Sなどの一定期間分の決済金利や信用リスク料金を含んだ手形決済レートが使用されます。

 

Rate 名称 内容
 TTS  Telegraphic
Transfer Selling Rate
(電信売り相場)
・銀行が外部に外国通貨を売却する際の適用レート。
・自国通貨を外国通貨に替える場合に適用。
・TTMに為替手数料がプラスされている。
(TTM+為替手数料)
 TTB  Telegraphic
Transfer Buying Rate
(電信買い相場)
・銀行が外部から外国通貨を購入する際の適用レート。
・外国通貨を自国通貨に替える場合に適用。
・TTMに為替手数料がマイナスされている。
(TTM-為替手数料)
 TTM  Telegraphic
Transfer Middle Rate
(仲値)
・TTSとTTBの中間レート。
・銀行とやり取りする際の基準値。
・外国為替市場(インターバンク市場)の取引実勢レートを基準に、金融機関ごとに決定される。
・TTS,TTBはTTMをベースに決定される。
 CASH S.  Cash Sell Rate
(外国通貨現金売り相場)
・銀行が一般顧客に外国通貨を売却する際の運用レート。
・TTMに一定の手数料を上乗せして設定される。
 CASH B.  Cash Buy Rate
(外国通貨現金買い相場)
・銀行が一般顧客から外国通貨を購入する際の適用レート。
・TTMに一定の手数料を減額して設定される。
 ACC  Acceptance Rate
(信用状付き一覧払い輸入手形決済相場)
・輸入手形の決済に適用されるレート。
・輸送期間中の金利の立替分がプラスされている。
(=TTS+輸送期間立替金利(Maildays Interest)
 A/S  At Sight buying Rate
(信用状付き一覧払い輸出手形買い相場)
・輸出手形の決済に適用されるレート。
・輸送期間中の金利立替分がマイナスされている。
(=TTB-輸送期間立替金利(Maildays Interest)
・D/P, D/A決済の買取相場は、A/Sレートをベースにリスク補正して設定される。
 Credit Buying Rate  Credit Buying Rate
(信用状付きユーザンス手形買い相場)
・銀行が、期限付き輸出手形を買い取る際の適用レート。
・銀行呈示後定期払いとなるため、一定期間分の金利立替分(Maildays Interest + Usance interest)がマイナスされる。(=TTB-(Maildays Interest + Usance interest) )
 Without Credit A/S Buying Rate  Without Credit A/S Buying Rate (信用状なし一覧払輸出手形買い相場)  ・銀行が、信用状のない輸出手形を買い取る際の適用レート。
・手形が決済されないリスクがあるため、メール金利に加えて信用リスク料金(Maildays Interest + Credit risk Interest)がマイナスされる。
(=TTB-(Maildays Interest+Credit risk interest))

 

為替変動における損得の考え方

中国の子会社に貸付けをします。

人民元(RMB)で半年間貸し付けるのですが、半年後の為替の変動によって為替差損益が発生します。

半年後円高の方がよいのか?円安の方がよいのか?一瞬考えてしまうことがあります。

たとえば・・今、1RMB 16円だから・・半年後に17円になったら儲かるから・・RMBが16円から17円になるということはRMBの価値があがることだから、円は安くなるということ・・だから円安になったら儲かる。。

なんて頭の中で計算してみたり、想像してみたりしますね。

でも、そんな難しく考えなくてもいいんです。

半年後に、人民元で返ってくる資金を円に替えます。つまり半年後に人民元で”円を買う”ということ。

この、”円を買う”ということがポイント。

買い物をするのに安くなった方が得しますね。逆に高くなったら損します。

外貨も同じで、買うのに安くなれば(円安)得します。高くなったら(円高)損します。

円を買うのに、安くなれば得するな。とすぐに想像できますね。