Python para finanzas (principiante): vea detrás de la tasa de cambio

Muchas personas han navegado por los sitios de comercio de FX para verificar las tasas de FX. Si está comprando una gran cantidad de moneda extranjera, ya sea para viajar o pagar gastos en el extranjero, verificará la tasa de cambio con frecuencia (probablemente varias veces al día, como yo) ya que una pequeña diferencia de tasa podría generar un gran impacto financiero.

Entonces surge la pregunta: ¿cómo podemos saber qué banco/agente ofrece la tasa más competitiva? ¿Y qué más podemos aprender de las tasas de cambio proporcionadas?

Como principiante en Python, encontré una manera simple de usar Python para:
1. Envíe una solicitud al sitio de comercio de FX para obtener tasas de FX en vivo y registrarlas en Excel
2. Compare las tarifas ofrecidas por múltiples agentes usando un gráfico de tendencia

Primero, comencemos con un sitio de comercio de FX que le guste.

Como chino, fui con dos importantes bancos chinos: Bank Of China y China Merchant Bank. Pero no se preocupe si elige uno diferente, la lógica aún se aplicaría.

A continuación se muestra lo que estoy viendo para los dos bancos que elijo.

Banco de China – Tipo de cambio
Captura de pantalla 2019-12-21 a las 18.40.15.png

China Merchant Bank – Tipo de cambio
Captura de pantalla 2019-12-21 a las 18.39.48.png

Si estuviera familiarizado con CSS/HTML (no se asuste si no es así), se daría cuenta: ambos tienen la forma de mesas!

Hablando simplemente, si abres el Enlace(¡haz clic en mí!) en Chrome, haz clic derecho y elige ‘inspeccionar’. Vería lo siguiente que muestra el código del sitio web. Al pasar el mouse sobre la sección de tasa de cambio en la pantalla, habría descubierto un tabla html!

Captura de pantalla 2019-12-21 en 18.51.28.png

En breve, un elemento de tabla html en cualquier página podría convertirse en un marco de datos de Pandas usando pd.read_html().

Como uno de los bancos solo proporciona datos en tiempo real, tengo que hacer una solicitud al sitio web cada 15 minutos y almacenar los datos de la tabla en Excel. Utilicé el siguiente código para hacer el trabajo, ¡pero estoy seguro de que también hay muchas formas de obtener los datos!

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 )

Luego, puede dejar que el código se ejecute durante uno o dos días para que recopile los datos.
Una vez que se recopilan los datos, tiene una serie de datos con los que jugar.

Al trazar gráficos de líneas, puede verificar qué bancos ofrecen las mejores tarifas; en mi caso, China Merchant Bank ofreció las tarifas más competitivas en ese momento.
Captura de pantalla 2019-12-26 a las 21.18.11.png

También noté que ambos bancos cobran diferenciales relativamente consistentes (la diferencia entre la tasa de compra y venta) a lo largo de los días. Pero en comparación, Bank of China parece estar cobrando diferenciales más altos que China Merchant Bank, como se calcula a continuación.

Captura de pantalla 2019-12-26 a las 21.17.30.png

Código de muestra:

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()

Con los datos de FX disponibles, hay más cosas que podríamos hacer, por ejemplo:

  1. Pudimos verificar si China Merchant Bank está ofreciendo tasas más competitivas en todas las monedas tanto para comprar como para vender.
  2. hay dos caídas en el gráfico trazado, ¿están siendo impulsadas por cierto evento financiero?
    etc.

Ya que también soy un principiante, ¡agradezco sus comentarios!

Similar Posts

Leave a Reply

Your email address will not be published.