Python для финансов (начинающий): смотрите за курсом FX
Многие люди просматривали торговые сайты FX, чтобы проверить курсы FX. Если вы покупаете большое количество иностранной валюты, будь то для путешествий или оплаты расходов за границей, вы будете часто проверять валютный курс (вероятно, несколько раз в день, как и я), поскольку небольшая разница в курсе может привести к довольно большим финансовым последствиям.
Поэтому возникает вопрос — как мы можем узнать, какой банк/агент предлагает наиболее конкурентоспособную ставку? И что еще мы можем узнать из предоставленных курсов FX?
Будучи новичком в Python, я нашел простой способ использовать Python для:
1. Отправьте запрос на торговую площадку FX, чтобы получить текущие курсы FX и записать их в Excel.
2. Сравните тарифы, предлагаемые несколькими агентами, используя график тренда.
Во-первых, давайте начнем с сайта для торговли на рынке Форекс, который вам нравится.
Как китаец, я работал с двумя крупными китайскими банками — Bank Of China и China Merchant Bank. Но не волнуйтесь, если вы выберете другой, логика все равно будет применяться.
Ниже приведено то, что я вижу для двух банков, которые я выбираю.
Банк Китая — Обменный курс
China Merchant Bank — Обменный курс
Если бы вы были знакомы с CSS/HTML (не паникуйте, если нет), то вы бы заметили — они оба представлены в виде столы!
Проще говоря, если открыть ссылка на сайт(щелкните меня!) В Chrome щелкните правой кнопкой мыши и выберите «проверить». Ниже вы увидите код веб-сайта. Наведя указатель мыши на раздел курсов валют на экране, вы бы обнаружили 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' : '
},
'CMBChina' : {
'link': '
'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, мы могли бы сделать больше, например:
- Мы могли бы проверить, предлагает ли China Merchant Bank более конкурентоспособные курсы по валютам как для продажи, так и для покупки.
- на графике есть два провала, вызваны ли они определенным финансовым событием?
и т.п.
Так как я тоже новичок, буду рада вашим отзывам!