외환 거래에서 기술 분석을 구현했습니다 (도입)

개요



외환 거래에서 알고리즘 거래 중 대표적인 것을 몇 가지 선택하여 구현한다.
이번 도입에서는 미국 달러(USD)에만 초점을 맞춰 가격 추이, 가격 변화율, 5일 이동평균선 등을 구현했다.

데이터



자료는 미즈호 은행의 히스토리컬 데이터 에서 일일 자료 등등을 취득할 수 있다.
CSV 형식이다.
그대로 취급하기 어렵기 때문에, index를 날짜, columns를 통화의 이름으로 했다.
def load_data():
    """
    為替情報をダウンロードしてくる
    Parameter
    ---------
    None

    Return
    ------
    df : pandas DataFrame
        取得した為替情報
    """
    url = "https://www.mizuhobank.co.jp/market/csv/quote.csv"
    r = requests.get(url)
    df = pd.read_csv(io.BytesIO(r.content), sep=",", encoding="cp932")

    nameOfCurrency = list(df.iloc[1].values)
    nameOfCurrency = nameOfCurrency[1:]
    nameOfCurrency = nameOfCurrency[:31] + nameOfCurrency[32:]

    date = list(df.T.iloc[0].values)
    date = date[2:]

    df = df.drop(df.columns[[0, 32]], axis=1)
    df = df.T.drop(df.T.columns[[0, 1]], axis=1)
    df = df.T
    df.index = date
    df.columns = nameOfCurrency
    return df

용어



실장한 것 중 익숙하지 않다고 생각하는 이하의 4개의 것에 대해서는, 각각의 항목에 있어서 도면을 이용하여 설명한다.
5일 이동 평균선
25일 이동평균선
골든 크로스
데드 크로스

구현



가격 추이



우선 csv 파일에 있는 2002/4/1에서 2019/8/30까지 $1의 가격을 플롯했다.

17년분이라고 그래프로 했을 때에 이해하기 어렵기 때문에, 20179/1로부터의 데이터를 새롭게 플롯했다.

def everyday(data, nation, begin, end):
    """
    欲しい通貨のデータを返す
    Parameters
    ----------
    data : pandas DataFrame
        必要なデータ
    nation : chr
        欲しい国の通貨
    begin : int
        欲しいデータの開始日
    end : int
        欲しいデータの最終日 + 1

    Return
    ------
    everyday : pandas dataFrame
        日次データを返す
    """
    currency = data["{}".format(nation)]
    currency = currency.astype(float)
    if(end == "no"):
        currency  = currency[begin:]
    else:
        currency = currency[begin:end]
    currency = pd.DataFrame(currency)
    currency = currency.T
    (currency.T).plot(figsize=(12, 8), title="USD / JPY")
    return currency

5일 이동 평균선



5일 이동 평균선이란?



5일 이동 평균선이란 과거 5일간의 종가의 평균치이다. 단기적인 추세를 나타냅니다.
메리트로서는 선의 움직임으로 일마다의 종가의 평균치가 상승하고 있는지, 하강하고 있는지를 곧바로 알 수 있다.
한편, 과거의 종가의 평균값이기 때문에, 상승 또는 하강 트렌드를 형성하고 있는 경우, 지연되기 쉽다.

2017/9/1에서 2019/8/31까지 5일 이동 평균선을 플로팅하였다.

def five_days_moving_average(data, nation, begin, end):
    """
    5日移動平均を求める

    Parameters
    ----------
    data : pandas dataframe
        必要なデータ
    nation : chr
        欲しいデータの国名
    begin : int
        欲しいデータの開始日のindex
    end : int
        欲しいデータの最終日のindex + 1

    Return
    ------
    five_days : pandas DataFrame
        欲しい通貨の5日移動平均のデータ
    """
    currency = data["{}".format(nation)]
    currency = currency.T
    currency = currency.astype(float)
    if(end == "no"):
        partOfDate = currency[begin:]
    else:
        partOfDate = currency[begin:end]

    five_days = []
    for i in range(len((partOfDate.values).tolist()) - 4):
        five_days.append(mean((partOfDate.values).tolist()[i:i + 5]))

    date = list(partOfDate.index)
    five_days = pd.Series(five_days, index=date[4:])
    five_days = pd.DataFrame(five_days).T
    five_days.index = ["five days"]
    (five_days.T).plot(figsize=(12, 8), title="five days moving average")
    return five_days

25일 이동평균선



25일 이동평균선이란?



25일 이동 평균선이란 지난 25일간의 종가의 평균치이다. 5일 이동평균선이 단기적인 트렌드를 나타내고 있는 반면 중장기적인 트렌드를 나타내고 있다.
2017/9/1에서 2019/8/31까지 25일 이동 평균선을 플로팅하였다.

def twenty_five_days_moving_average(data, nation, begin, end):
    """
    25日移動平均を求める

    Parameters
    ----------
    data : pandas dataframe
        必要なデータ
    nation : chr
        欲しいデータの国名
    begin : int
        欲しいデータの開始日のindex
    end : int
        欲しいデータの最終日のindex + 1

    Return
    ------
    five_days : pandas DataFrame
        欲しい通貨の25日移動平均のデータ
    """
    currency = data["{}".format(nation)]
    currency = currency.T
    currency = currency.astype(float)
    if(end == "no"):
        partOfDate = currency[begin:]
    else:
        partOfDate = currency[begin:end]

    twenty_five_days = []
    for i in range(len((partOfDate.values).tolist()) - 24):
        twenty_five_days.append(mean((partOfDate.values).tolist()[i:i + 25]))

    date = list(partOfDate.index)
    twenty_five_days = pd.Series(twenty_five_days, index=date[24:])
    twenty_five_days = pd.DataFrame(twenty_five_days).T
    twenty_five_days.index = ["twenty five days"]
    (twenty_five_days.T).plot(figsize=(12, 8), title="twenty five days moving average")
    return twenty_five_days

골든 크로스와 데드 크로스



골든 크로스란?



골든 크로스란 5일 이동평균선(단기적 트렌드)이 25일 이동평균선(중장기적 트렌드)을 아래에서 위로 크로스한 타이밍에 사인을 나타내는 것이다.

데드 크로스란?



데드 크로스란 5일 이동평균선(단기적 트렌드)이 25일 이동평균선(중장기적 트렌드)을 위에서 아래로 크로스한 타이밍에 판매 사인을 나타내는 것이다.

5일 이동평균선과 25일 이동평균선을 겹쳐 본다. 그러면 청색의 5일 이동평균선과 25일 이동평균선이 교차하는 곳이 있다. 빨간색 원이 황금 십자가를 나타내고 녹색 원이 죽은 십자가를 나타냅니다.


끝에



가능한 한 시각적으로 알 수 있도록 했습니다.
아직 기술 분석 중 간단한 것입니다만, 앞으로 점점 다른 분석 방법을 구현해 나가고 싶습니다. 코드에 대해서는 github 에 올 예정입니다.

참고



이동 평균선 사용

좋은 웹페이지 즐겨찾기