Многие люди просматривали торговые сайты FX, чтобы проверить валютные курсы. Если вы покупаете большое количество иностранной валюты, будь то для путешествий или оплаты зарубежных расходов, вы будете часто проверять валютный курс (возможно, несколько раз в день – как я), поскольку небольшая разница в курсе может привести к довольно большим финансовым последствиям.
Поэтому возникает вопрос — как мы можем знать, какой банк/агент предлагает наиболее конкурентоспособную ставку? И что еще мы могли бы узнать из предоставленных валютных курсов?
Будучи новичком в Python, я нашел простой способ использовать Python для: 1. Отправить запрос на сайт FX trading, чтобы получить живые курсы валют и записать их в excel 2. Сравните цены, предлагаемые несколькими агентами, используя график тренда
Во-первых, давайте начнем с торгового сайта FX, который вам нравится.
Как китаец, я работал с двумя крупными китайскими банками – Bank Of China и China Merchant Bank. Но не волнуйтесь, если вы выберете другой вариант, логика все равно будет применяться.
Ниже приведено то, что я вижу для двух банков, которые я выбираю.
Банк Китая – Валютный курс
Китайский торговый банк – Валютный курс
Если бы вы были знакомы с CSS/HTML (не паникуйте, если нет), то вы бы заметили – они оба находятся в виде таблиц !
Проще говоря , если вы откроете ссылку (click me!) в Chrome, щелкните правой кнопкой мыши и выберите “проверить”. Вы увидите ниже, где показан код веб-сайта. Наведя курсор мыши на раздел FX rate на экране, вы бы обнаружили html-таблицу !
Короче говоря, элемент 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 предлагал более конкурентоспособные ставки в то время.
Я также заметил, что оба банка взимают относительно последовательные спреды (разница между курсом продажи и покупки) в течение нескольких дней. Но для сравнения, Bank of China, похоже, взимает более высокие спреды, чем China Merchant Bank, как показано ниже.
Пример кода:
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, мы могли бы сделать гораздо больше , например:
- Мы могли бы проверить, предлагает ли Китайский торговый банк более конкурентоспособные ставки по всем валютам как для продажи, так и для покупки
- на построенном графике есть два провала, вызваны ли они определенным финансовым событием? и т. д.
Поскольку я тоже новичок, я приветствую ваши отзывы !