File size: 3,628 Bytes
5fb2a02
 
 
 
 
 
cf73df8
8e3072c
5fb2a02
2863f52
 
f7ed643
 
 
0d1bfaa
5fb2a02
f7ed643
5fb2a02
d79400e
 
5fb2a02
 
 
 
0d1bfaa
f7ed643
d79400e
f7ed643
5fb2a02
 
 
2863f52
5fb2a02
2863f52
5fb2a02
 
8e3072c
f7ed643
5fb2a02
8e3072c
5fb2a02
 
 
 
 
 
 
8e3072c
5fb2a02
8e3072c
 
 
 
 
 
5fb2a02
f7ed643
2863f52
 
 
 
 
 
 
 
 
 
 
f7ed643
 
 
 
 
 
 
2863f52
 
 
 
 
 
f7ed643
 
 
 
2863f52
f7ed643
 
2863f52
f7ed643
 
2863f52
f7ed643
 
2863f52
f7ed643
 
 
 
 
8e3072c
f7ed643
 
 
 
 
8e3072c
f7ed643
 
8e3072c
0d1bfaa
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from env import Environment
from policy import Policy
from utils import myOptimizer

import pandas as pd
import numpy as np
import torch
from collections import OrderedDict

import matplotlib.pyplot as plt

from tqdm import tqdm
from torch.utils.tensorboard import SummaryWriter


if __name__ == "__main__":
    writer = SummaryWriter('runs/new_data_ex_7')

    data = pd.read_csv('./data/EURUSD_Candlestick_1_M_BID_01.01.2021-04.02.2023.csv')
    # data = pd.read_csv('./data/EURUSD_Candlestick_30_M_BID_01.01.2021-04.02.2023.csv')
    # data['Local time'] = pd.to_datetime(data['Local time'])
    data = data.set_index('Local time')
    print(data.index.min(), data.index.max())

    date_split = '01.09.2022 00:00:00.000 GMT-0500'
    # date_split = '25.08.2022 04:30:00.000 GMT-0500' # 30 min
    # date_split = '03.02.2023 15:30:00.000 GMT-0600' # 30 min

    train = data[:date_split]
    test = data[date_split:]

    learning_rate = 0.001
    first_momentum = 0.0
    second_momentum = 0.0001
    transaction_cost = 0.0001
    adaptation_rate = 0.01
    state_size = 15
    equity = 1.0

    agent = Policy(input_channels=state_size)
    optimizer = myOptimizer(learning_rate, first_momentum, second_momentum, adaptation_rate, transaction_cost)

    history = []
    for i in range(1, state_size):
        c = train.iloc[i, :]['Close'] - train.iloc[i-1, :]['Close']
        history.append(c)

    env = Environment(train, history=history, state_size=state_size)
    observation = env.reset()

    model_gradients_history = dict()
    checkpoint = OrderedDict()

    for name, param in agent.named_parameters():
        model_gradients_history.update({name: torch.zeros_like(param)})

    for i in tqdm(range(state_size, len(train))):
        observation = torch.as_tensor(observation).float()
        action = agent(observation)
        observation, reward, _ = env.step(action.data.to("cpu").numpy())
        
        action.backward()

        for name, param in agent.named_parameters():
            grad_n = param.grad
            param = param + optimizer.step(grad_n, reward, observation[-1], model_gradients_history[name])
            checkpoint[name] = param
            model_gradients_history.update({name: grad_n})

        if i > 10000:
            equity += env.profit
            writer.add_scalar('equity', equity, i)    
        else:
            writer.add_scalar('equity', 1.0, i) 

        optimizer.after_step(reward)
        agent.load_state_dict(checkpoint)

    ###########
    ###########

    # history = []
    # for i in range(1, state_size):
    #     c = test.iloc[i, :]['Close'] - test.iloc[i-1, :]['Close']
    #     history.append(c)

    # env = Environment(test, history=history, state_size=state_size)
    # observation = env.reset()

    # model_gradients_history = dict()
    # checkpoint = OrderedDict()

    # for name, param in agent.named_parameters():
    #     model_gradients_history.update({name: torch.zeros_like(param)})

    # for _ in tqdm(range(state_size, len(test))):
    #     observation = torch.as_tensor(observation).float()
    #     action = agent(observation)
    #     observation, reward, _ = env.step(action.data.numpy())
    #     action.backward()

    #     for name, param in agent.named_parameters():
    #         grad_n = param.grad
    #         param = param + optimizer.step(grad_n, reward, observation[-1], model_gradients_history[name])
    #         checkpoint[name] = param
    #         model_gradients_history.update({name: grad_n})

    #     optimizer.after_step(reward)
    #     agent.load_state_dict(checkpoint)

    print(env.profits)