Oanda环境

本文介绍了一个名为OandaEnv的Python模块,它利用Oanda的历史金融数据来训练交易机器人。模块包括数据处理、特征工程、环境状态获取以及奖励函数设计,用于在金融环境中模拟交易决策过程。
摘要由CSDN通过智能技术生成

下面是带有 OandaEnv 类的 Python 模块,用于基于 Oanda 历史数据训练交易机器人。 # # 金融环境 # # (c) Dr. Yves J. Hilpisch # Artificial Intelligence in Finance # # import math import tpqoa import random import numpy as np 执行与部署 | 305 import pandas as pd class observation_space: def __init__(self, n): self.shape = (n,) class action_space: def __init__(self, n): self.n = n def sample(self): return random.randint(0, self.n - 1) class OandaEnv: def __init__(self, symbol, start, end, granularity, price, features, window, lags, leverage=1, min_accuracy=0.5, min_performance=0.85, mu=None, std=None): self.symbol = symbol self.start = start self.end = end self.granularity = granularity self.price = price self.api = tpqoa.tpqoa('../aiif.cfg') self.features = features self.n_features = len(features) self.window = window self.lags = lags self.leverage = leverage self.min_accuracy = min_accuracy self.min_performance = min_performance self.mu = mu self.std = std self.observation_space = observation_space(self.lags) self.action_space = action_space(2) self._get_data() self._prepare_data() def _get_data(self): ''' 从Oanda检索数据 ''' self.fn = f'../../source/oanda/' ➊ self.fn += f'oanda_{self.symbol}_{self.start}_{self.end}_' ➋ self.fn += f'{self.granularity}_{self.price}.csv' ➋ self.fn = self.fn.replace(' ', '_').replace('-', '_').replace(':', '_') try: self.raw = pd.read_csv(self.fn, index_col=0, parse_dates=True) ➌ except: self.raw = self.api.get_history(self.symbol, self.start, self.end, self.granularity, self.price) ➍ self.raw.to_csv(self.fn) ➎ 306 | 第 12 章 self.data = pd.DataFrame(self.raw['c']) ➏ self.data.columns = [self.symbol] ➐ def _prepare_data(self): ''' 准备额外的时间序列数据(如特征数据) ''' self.data['r'] = np.log(self.data / self.data.shift(1)) self.data.dropna(inplace=True) self.data['s'] = self.data[self.symbol].rolling(self.window).mean() self.data['m'] = self.data['r'].rolling(self.window).mean() self.data['v'] = self.data['r'].rolling(self.window).std() self.data.dropna(inplace=True) if self.mu is None: self.mu = self.data.mean() self.std = self.data.std() self.data_ = (self.data - self.mu) / self.std self.data['d'] = np.where(self.data['r'] > 0, 1, 0) self.data['d'] = self.data['d'].astype(int) def _get_state(self): ''' 获取环境的当前状态的私有方法 ''' return self.data_[self.features].iloc[self.bar - self.lags:self.bar].values def get_state(self, bar): ''' 获取环境的当前状态 ''' return self.data_[self.features].iloc[bar - self.lags:bar].values def reset(self): ''' 对环境进行复位重置 ''' self.treward = 0 self.accuracy = 0 self.performance = 1 self.bar = self.lags state = self._get_state() return state def step(self, action): ''' 将环境状态向前推进一步 ''' correct = action == self.data['d'].iloc[self.bar] ret = self.data['r'].iloc[self.bar] * self.leverage reward_1 = 1 if correct else 0 ➑ reward_2 = abs(ret) if correct else -abs(ret) ➒ reward = reward_1 + reward_2 * self.leverage ➓ self.treward += reward_1 self.bar += 1 self.accuracy = self.treward / (self.bar - self.lags) self.performance *= math.exp(reward_2) if self.bar >= len(self.data): done = True elif reward_1 == 1: 执行与部署 | 307 done = False elif (self.accuracy < self.min_accuracy and self.bar > self.lags + 15): done = True elif (self.performance < self.min_performance and self.bar > self.lags + 15): done = True else: done = False state = self._get_state() info = {} return state, reward, done, info ➊ 定义数据文件的路径。 ➋ 定义数据文件的文件名。 ➌ 如果存在相应的数据文件,则读取数据。 ➍ 如果不存在这样的文件,则检索 API 的数据。 ➎ 将数据作为 CSV 文件写入磁盘。 ➏ 选择包含收盘价的列。 ➐ 将列重命名为工具名称(标记)。 ➑ 对正确预测的奖励。 ➒ 对实现的收益的奖励(收益率)。 ➓ 对预测和收益的综合奖励。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值