外汇历史数据在Python

j91ykkif  于 2023-02-02  发布在  Python
关注(0)|答案(9)|浏览(179)

我需要在Python中获得历史外汇数据的解决方案。
对于股票来说很容易:

import pandas as pd
import pandas_datareader as pdr

start = dt.date.today() - dt.timedelta(days=30)
end = dt.date.today()

df = pdr.DataReader('AAPL', 'google', start, end)
print(df.head())

我试过谷歌、雅虎、弗雷德和Oanda,似乎都不起作用。
请给予一个代码示例说明如何请求数据。(大多数情况下一行就可以了)。

jmo0nnb3

jmo0nnb31#

你只需要历史货币价值吗?
试着用**forex_python**模块和datetime类(来自datetime模块),我用的是python3,但我怀疑这有多大关系。
这些汇率是欧洲央行自1999年以来的下午3点(CET)数据。

>>> from datetime import datetime
>>> from forex_python.converter import get_rate

>>> t = datetime(2001, 10, 18)  # the 18th of October, 2001
>>> get_rate("USD", "GBP", t)
0.69233
>>> get_rate("GBP", "USD", t)
1.4444
>>> 1 / 1.4444   # check
0.6923289947382997 

>>> t = datetime(2006, 6, 26)  # June 26th, 2006
>>> get_rate("GBP", "USD", t)
1.8202

所以
2001年10月18日,1美元== 0.69英镑,
2006年6月26日,1英镑== 1.82美元。

rmbxnbpk

rmbxnbpk2#

零售经纪商的信息总是不对称的,但我不同意没有好的历史信息。外汇的行业标准是EBS信息。然而,这是一个昂贵的选择。FXMarketAPI提供了一个与此非常匹配的提要。它不隶属于任何经纪人。API有一个Pandas端点,可以帮助您提取数据。尽管免费用户的请求数量限制为1000。你可以看到下面的例子。

URL = "https://fxmarketapi.com/apipandas"
params = {'currency' : 'EURUSD',
'start_date' : '2018-07-02',
'end_date':'2018-12-06',
'api_key':'**************'}

response = requests.get("https://fxmarketapi.com/apipandas", params=params)
df= pd.read_json(response.text)
ig9co6j1

ig9co6j13#

也许你还不够努力:)几个月前,一个非常好看的小伙子发表了这篇文章。诚然,这不是最好的代码(第一个开源项目),然而,它目前正在开发中,并不断改进。下一个版本将更加高效和干净。

设计来存储所有FXCM的历史数据本地Mariadb像这样.

+---------------------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+--------+
    | date                | bidopen   | bidhigh   | bidlow    | bidclose  | askopen   | askhigh   | asklow    | askclose  | volume |
    +---------------------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+--------+
    | 2017-04-27 10:01:00 | 17.294000 | 17.296000 | 17.289000 | 17.290000 | 17.340000 | 17.340000 | 17.334000 | 17.335000 |    113 |
    | 2017-04-27 10:02:00 | 17.290000 | 17.298000 | 17.285000 | 17.295000 | 17.335000 | 17.342000 | 17.330000 | 17.340000 |    114 |
    | 2017-04-27 10:03:00 | 17.295000 | 17.301000 | 17.289000 | 17.299000 | 17.340000 | 17.347000 | 17.340000 | 17.344000 |     98 |
    | 2017-04-27 10:04:00 | 17.299000 | 17.300000 | 17.286000 | 17.295000 | 17.344000 | 17.345000 | 17.330000 | 17.340000 |    124 |
    | 2017-04-27 10:05:00 | 17.295000 | 17.295000 | 17.285000 | 17.292000 | 17.340000 | 17.340000 | 17.330000 | 17.336000 |    130 |
    | 2017-04-27 10:06:00 | 17.292000 | 17.292000 | 17.279000 | 17.292000 | 17.336000 | 17.336000 | 17.328000 | 17.332000 |     65 |
    | 2017-04-27 10:07:00 | 17.292000 | 17.304000 | 17.287000 | 17.298000 | 17.332000 | 17.348000 | 17.332000 | 17.345000 |    144 |
    | 2017-04-27 10:08:00 | 17.298000 | 17.306000 | 17.297000 | 17.302000 | 17.345000 | 17.350000 | 17.343000 | 17.346000 |     96 |
    | 2017-04-27 10:09:00 | 17.302000 | 17.303000 | 17.294000 | 17.294000 | 17.346000 | 17.346000 | 17.338000 | 17.338000 |     50 |
    | 2017-04-27 10:10:00 | 17.294000 | 17.296000 | 17.281000 | 17.291000 | 17.338000 | 17.338000 | 17.328000 | 17.333000 |     50 |

或者如果您只是想要基本的工具来让您开始并构建自己的工具。

您需要一个模拟或真实的福汇账户来获取数据,他们提供不同时间段(fxcm)的免费10年历史数据。

vu8f3i0k

vu8f3i0k4#

FXCM最近发布了一个官方的python forexconnect Package 器。
有一个支持论坛:http://www.fxcodebase.com/code/viewforum.php?f=51&sid=e2b414c06f9714c605f117f74d689a9b
下面是一篇关于获取历史记录的文章中的代码片段:

from forexconnect import fxcorepy, ForexConnect
    with ForexConnect() as fx:
        try:
            fx.login("user_id", "password", "fxcorporate.com/Hosts.jsp",
                     "Demo", session_status_callback=session_status_changed)

            history = fx.get_history("EUR/USD", "H1",
                                    datetime.datetime.strptime("MM.DD.YYYY HH:MM:SS", '%m.%d.%Y %H:%M:%S').replace(tzinfo=datetime.timezone.utc),
                                    datetime.datetime.strptime("MM.DD.YYYY HH:MM:SS", '%m.%d.%Y %H:%M:%S').replace(tzinfo=datetime.timezone.utc))
fcg9iug3

fcg9iug35#

从2009年开始,pepperstone以每月csv格式提供免费的基于蜱虫的历史数据(访问:https://www.truefx.com/?page=downloads)对于大多数流行的对,我已经写了python代码使用selenium下载所有的csv文件(脚本将下载所有的csv文件到文件夹名称forex):

import datetime, time, os
from dateutil.relativedelta import relativedelta

from selenium import webdriver

tmp_dir = os.path.join(os.getcwd(), 'forex')
if not os.path.isdir(tmp_dir): os.makedirs(tmp_dir)
options = webdriver.ChromeOptions();
options.add_argument("--window-size=1300,900")
options.add_experimental_option("prefs", {
    "download.default_directory": tmp_dir,
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "safebrowsing.enabled": False,
    "safebrowsing.disable_download_protection": True
})
options.add_argument("--disable-gpu")
options.add_argument("--disable-extensions")
options.add_argument('--disable-logging')
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-certificate-errors-spki-list')
options.add_argument('--no-sandbox')
browser = webdriver.Chrome(options=options)

pairs = ['AUDJPY', 'AUDNZD', 'AUDUSD', 'CADJPY', 'CHFJPY', 'EURCHF', 'EURGBP', 'EURJPY', 'EURUSD', 'GBPJPY', 'GBPUSD', 'NZDUSD', 'USDCAD', 'USDCHF', 'USDJPY']
for pair in pairs:
    curr_date = datetime.datetime(2015, 1, 1)
    while curr_date + relativedelta(months=1) < datetime.datetime.now():
        file_name = '{p}-{ym2}.zip'.format(p=pair, ym2=curr_date.strftime('%Y-%m'))
        url = 'http://www.truefx.com/dev/data/{y}/{ym1}/{p}-{ym2}.zip'.format(
            y=curr_date.strftime('%Y'),
            ym1=curr_date.strftime('%B').upper()+'-'+curr_date.strftime('%Y') if curr_date <= datetime.datetime(2017, 3, 1) else curr_date.strftime('%Y-%m'),
            p=pair,
            ym2=curr_date.strftime('%Y-%m')
        )
        file_found = False
        for root, dirs, files in os.walk(tmp_dir):
            for file in files:
                if file_name in file: file_found = True 
        if not file_found:
            time.sleep(5)
            browser.get (url)
            file_downloaded = False
            while not file_downloaded:
                time.sleep(1)
                for root, dirs, files in os.walk(tmp_dir):
                    for file in files:
                        if file_name in file and not '.crdownload' in file: file_downloaded = True
            print(file_name, 'downloaded from', url)
        curr_date = curr_date + relativedelta(months=1)
print('completed')

要点来源:https://gist.github.com/mamedshahmaliyev/bca9242b7ea6a13b3f76dee7a5aa111a

0g0grzrc

0g0grzrc6#

您可以使用fxcmpy。http://fxcmpy.tpq.io/
下面是一个简单示例:

import matplotlib.pyplot as plt
import datetime as dt
import fxcmpy

con = fxcmpy.fxcmpy(config_file='fxcm.cfg') 
# must optain API Token, see link for details.

start = dt.datetime(2018, 7, 6,8,0,0)
end = dt.datetime(2018, 7, 7,18,0,0)

c = con.get_candles('XAU/USD', period='m1', columns=['bidclose','tickqty'], start=start, end=end )

# Basic plotting of close and volumne data

fig, ax = plt.subplots(figsize=(11,8))
ax.plot(c.index,c['bidclose'], lw=1, color='B',label="Close")
ax2= ax.twinx()
ax2.plot(c.index,c['tickqty'], lw=1, color='G',label="Volume")
plot.show()
tjrkku2a

tjrkku2a7#

from datetime import datetime
import MetaTrader5 as mt5
# display data on the MetaTrader 5 package
print("MetaTrader5 package author: ",mt5.__author__)
print("MetaTrader5 package version: ",mt5.__version__)
 
# import the 'pandas' module for displaying data obtained in the tabular form
import pandas as pd
pd.set_option('display.max_columns', 500) # number of columns to be displayed
pd.set_option('display.width', 1500)      # max table width to display
# import pytz module for working with time zone
import pytz
 
# establish connection to MetaTrader 5 terminal
if not mt5.initialize():
    print("initialize() failed, error code =",mt5.last_error())
    quit()
 
# set time zone to UTC
timezone = pytz.timezone("Etc/UTC")
# create 'datetime' objects in UTC time zone to avoid the implementation of a local time zone offset
utc_from = datetime(2020, 1, 10, tzinfo=timezone)
utc_to = datetime(2020, 1, 11, hour = 13, tzinfo=timezone)
# get bars from USDJPY M5 within the interval of 2020.01.10 00:00 - 2020.01.11 13:00 in UTC time zone
rates = mt5.copy_rates_range("USDJPY", mt5.TIMEFRAME_M5, utc_from, utc_to)
 
# shut down connection to the MetaTrader 5 terminal
mt5.shutdown()
 
# display each element of obtained data in a new line
print("Display obtained data 'as is'")
counter=0
for rate in rates:
    counter+=1
    if counter<=10:
        print(rate)
 
# create DataFrame out of the obtained data
rates_frame = pd.DataFrame(rates)
# convert time in seconds into the 'datetime' format
rates_frame['time']=pd.to_datetime(rates_frame['time'], unit='s')
 
# display data
print("\nDisplay dataframe with data")
print(rates_frame.head(10))
sg2wtvxw

sg2wtvxw8#

您可以使用Trademade Python SDK,它提供daily historical data并代表来自银行和经纪商的汇总数据源。作为其独立的数据提供者,您不太可能看到扭曲的汇率。您可以将其与经纪商数据源进行比较,以检查扭曲程度。

pip install tradermade

import tradermade as tm

# set api key
tm.set_rest_api_key("api_key")

# get timeseries data

tm.timeseries(currency='EURUSD', start="2022-04-20",end="2022-04-22",interval="daily",fields=["open", "high", "low","close"])
k0pti3hp

k0pti3hp9#

(引文:) 在大多数情况下,一行就可以了?

在这一点上,人们错得不能再错了。
外汇交易历史数据是不存在的。每个外汇交易中介(经纪商)创建自己的交易条款和条件。即使是同一个经纪商也可能为同一货币对交易提供几个不同的(或不一致的,如果您愿意)价格反馈,以便满足每个“产品”的条款和条件。
外汇生态系统是一个分散、多主体/多角色、主要是分布式的全球市场。
因此,最好忘记使用SLOC,它是一个神奇的单行程序,可以从某个不存在的神圣API获得普遍有效的响应。

是的,可以接收外汇数据-但每个经纪商提供不同的情况:

x1c 0d1x是的,您可以针对特定类型的交易账户,针对来自特定经纪商的不同API服务集成本地主机流程(有关此类数据馈送的详细内容,请参阅相应的条款和条件)。
有些经纪商会公布本地的报价数据,有些则不会。有些研究机构可能会帮助您进行一些研究工作,并分享特定CCY对的报价数据的选定部分。但没有全球整合。它根本没有理由整合这种服务,因为它没有任何附加值。
如果一个人的体外定量建模有任何意义,那么这个模型应该在同一个市场上得到验证,在这个市场上,交易预计将在体内进行。
因此,您需要一个特定的市场准入中介的数据(经纪人要求此),其中您的服务将在体内运行。

相关问题