Рубрики
Без рубрики

Python For Finance(Beginner): Смотрите За валютным курсом

Начинающий Финансовый проект Python

Автор оригинала: Ivy Li.

Многие люди просматривали торговые сайты FX, чтобы проверить валютные курсы. Если вы покупаете большое количество иностранной валюты, будь то для путешествий или оплаты зарубежных расходов, вы будете часто проверять валютный курс (возможно, несколько раз в день – как я), поскольку небольшая разница в курсе может привести к довольно большим финансовым последствиям.

Поэтому возникает вопрос — как мы можем знать, какой банк/агент предлагает наиболее конкурентоспособную ставку? И что еще мы могли бы узнать из предоставленных валютных курсов?

Будучи новичком в Python, я нашел простой способ использовать Python для: 1. Отправить запрос на сайт FX trading, чтобы получить живые курсы валют и записать их в excel 2. Сравните цены, предлагаемые несколькими агентами, используя график тренда

Во-первых, давайте начнем с торгового сайта FX, который вам нравится.

Как китаец, я работал с двумя крупными китайскими банками – Bank Of China и China Merchant Bank. Но не волнуйтесь, если вы выберете другой вариант, логика все равно будет применяться.

Ниже приведено то, что я вижу для двух банков, которые я выбираю.

Банк Китая – Валютный курс

Скриншот 2019-12-21 в 18.40.15.png

Китайский торговый банк – Валютный курс

Скриншот 2019-12-21 в 18.39.48.png

Если бы вы были знакомы с CSS/HTML (не паникуйте, если нет), то вы бы заметили – они оба находятся в виде таблиц !

Проще говоря , если вы откроете ссылку (click me!) в Chrome, щелкните правой кнопкой мыши и выберите “проверить”. Вы увидите ниже, где показан код веб-сайта. Наведя курсор мыши на раздел FX rate на экране, вы бы обнаружили html-таблицу !

Скриншот 2019-12-21 в 18.51.28.png

Короче говоря, элемент html-таблицы на любой странице может быть преобразован в фрейм данных Pandas с помощью pd.read_html().

Поскольку один из банков предоставляет данные только в режиме реального времени, я должен делать запрос на веб-сайт каждые 15 минут и хранить табличные данные в excel. Я использовал приведенный ниже код, чтобы сделать эту работу, но я уверен, что есть много способов получить данные, а также!

import time
import requests
import xlsxwriter
import pandas as pd
from lxml import etree
from datetime import datetime


config = {
    'BankOfChina': {
        'link' : 'https://www.bankofchina.com/sourcedb/whpj/enindex_1619.html',
    },
    'CMBChina' : {
        'link': 'http://english.cmbchina.com/Rate/ForexRates.aspx',
        'xpath' : '//*[@id="rightpart"]/div[3]/div[2]/div[1]/text()',
    }
}


def requestFxTable(bankLink):
    # make a request to the website and asking for the table
    # Bank of China have different format and i have to clean it using loc
    if bankLink == config['BankOfChina']['link'] :
        df = pd.read_html(bankLink)[4].loc[4:31,:6]
        return df
    elif bankLink == config['CMBChina']['link'] :
        df = pd.read_html(bankLink)[0]
        return df
    
def enrich_time_prefix(df , bankLink):
    page = requests.get(bankLink)
    tree = etree.HTML(page.text)
    time_prefix = tree.xpath(config['CMBChina']['xpath'])
    time_prefix = time_prefix[1][:10]
    df['Time'] = time_prefix +' '+ df['Time']

def requestFxRate(bankLink):
    df = requestFxTable(bankLink)
    #change columns and rows to make the table more neat
    df.columns = df.iloc[0]
    df = df[1:]
    #add a request time to keep track 
    df['RequestTime_UK'] = datetime.now()
    if bankLink == config['CMBChina']['link'] :
        #CMB have slightly different time format thus need to add a prefix before time
        enrich_time_prefix(df, bankLink)
        return df
    return df

def dataWriter(bank):
    df_All = pd.read_excel('/Users/Ivy_li/Fx_Rate_{}.xlsx'.format(bank))
    df = requestFxRate(config[bank]['link'])
    df_All = df_All.append(df)
    df_All.to_excel('/Users/Ivy_li/Fx_Rate_{}.xlsx'.format(bank))
    
#Once you have got the data, you could store it into excel
count = 0
while count < 21600 :
    count += 1
    #request every 15 mins , you could change the frequency 
    time.sleep(60.0*15)
    #open excel and write the data
    for bank in config.keys():
        dataWriter( bank )

Затем вы можете оставить код для запуска на день или два, чтобы он собрал данные. Как только данные собраны, у вас есть ряд данных, с которыми вы можете играть.

Построив линейные графики, вы могли бы проверить, какие банки предлагают лучшие ставки – в моем случае China Merchant Bank предлагал более конкурентоспособные ставки в то время.

Скриншот 2019-12-26 в 21.18.11.png

Я также заметил, что оба банка взимают относительно последовательные спреды (разница между курсом продажи и покупки) в течение нескольких дней. Но для сравнения, Bank of China, похоже, взимает более высокие спреды, чем China Merchant Bank, как показано ниже.

Скриншот 2019-12-26 в 21.17.30.png

Пример кода:

import pandas as pd
import plotly.graph_objs as go

xls_BOC = pd.ExcelFile('Fx_Rate_BankOfChina.xlsx')
xls_CMB = pd.ExcelFile('Fx_Rate_CMBChina.xlsx')
df_BOC = pd.read_excel(xls_BOC)
df_CMB = pd.read_excel(xls_CMB)
df_BOC = df_BOC[df_BOC['Currency Name'] == 'GBP']
df_CMB = df_CMB[df_CMB['Currency'] == 'GB Pound Sterling']

fig_FX = go.Figure()
fig_FX.add_trace(go.Line(y = df_BOC['Cash Selling Rate'], x = pd.to_datetime(df_BOC['Pub Time']), name='BOC-Selling Rate(GBP)'))
fig_FX.add_trace(go.Line(y = df_CMB['Selling rate'], x = pd.to_datetime(df_CMB['Time']), name='CMB-Selling Rate(GBP)'))
fig_FX.update_layout(
    title="Trend Graph - FX rate",
    xaxis_title="Time",
    yaxis_title="GBP Rate"
)
fig_FX.show()

fig_FX_Spreads = go.Figure()
fig_FX_Spreads.add_trace(go.Line(y = df_BOC['Cash Selling Rate']-df_BOC['Cash Buying Rate'], x = pd.to_datetime(df_BOC['Pub Time']), name='BOC-Bid Rate(GBP)'))
fig_FX_Spreads.add_trace(go.Line(y = df_CMB['Selling rate']-df_CMB['Cash bid'], x = pd.to_datetime(df_CMB['Time']), name='CMB-Bid Rate(GBP)'))
fig_FX_Spreads.update_layout(
    title="Trend Graph - FX spreads rate",
    xaxis_title="Time",
    yaxis_title="Spreads"
)
fig_FX_Spreads.show()

Имея под рукой данные FX, мы могли бы сделать гораздо больше , например:

  1. Мы могли бы проверить, предлагает ли Китайский торговый банк более конкурентоспособные ставки по всем валютам как для продажи, так и для покупки
  2. на построенном графике есть два провала, вызваны ли они определенным финансовым событием? и т. д.

Поскольку я тоже новичок, я приветствую ваши отзывы !