নিউরাল নেটওয়ার্ক এবং ডিজিটাল মুদ্রা পরিমাণগত লেনদেন সিরিজ ((2) গভীরতা reinforcement শেখার প্রশিক্ষণ বিটকয়েন লেনদেন কৌশল

লেখক:ঘাস, তৈরিঃ 2019-07-31 11:13:15, আপডেটঃ 2023-10-20 20:10:18

img

1.介绍

পূর্ববর্তী নিবন্ধএলএসটিএম নেটওয়ার্ক ব্যবহার করে বিটকয়েনের দামের পূর্বাভাসhttps://www.fmz.com/digest-topic/4035এই নিবন্ধটি RNN এবং pytorch এর সাথে পরিচিত হওয়ার জন্য একটি ছোট্ট অনুশীলনকারী প্রকল্প। এই নিবন্ধটি সরাসরি ট্রেডিং কৌশল প্রশিক্ষণের জন্য শক্তিশালী শেখার পদ্ধতি ব্যবহার করবে। শক্তিশালী শেখার মডেলটি ওপেনএআই ওপেন সোর্স পিপিও এবং পরিবেশটি জিমের স্টাইলকে উল্লেখ করে। বোঝার এবং পরীক্ষার সুবিধার্থে, এলএসটিএম এর পিপিও মডেল এবং পুনরায় পরীক্ষা করা জিমের পরিবেশগুলি সরাসরি অব্যবহৃত প্যাকেজগুলি লিখতে পারে। পিপিও, যার পূর্ণ নাম হল Proximal Policy Optimization, এটি Policy Graident, অর্থাৎ কৌশল তৃণমূলে একটি অপ্টিমাইজেশান উন্নতি। জিমটিও ওপেনএআই দ্বারা প্রকাশিত। এটি কৌশল নেটওয়ার্কের সাথে ইন্টারঅ্যাক্ট করতে পারে, বর্তমান পরিবেশের অবস্থা এবং পুরষ্কারের প্রতিক্রিয়া জানাতে পারে। এই নিবন্ধটি পড়ার জন্য একটি নির্দিষ্ট পাইথন, পাইটর্চ, ডিআরএল গভীরতা জোরদার শেখার ভিত্তি প্রয়োজন। তবে এটি গুরুত্বপূর্ণ নয়, এই নিবন্ধে দেওয়া কোডের সাথে মিলিয়ে এটি সহজেই শিখতে পারে। এই নিবন্ধটি এফএমজেডের আবিষ্কারক ডিজিটাল মুদ্রার পরিমাণগত ট্রেডিং প্ল্যাটফর্ম সরবরাহ করে।www.fmz.com), QQ গ্রুপে আপনাকে স্বাগতমঃ 863946592 ।

2.数据和学习参考资料

বিটকয়েনের দামের তথ্য এফএমজেডের উদ্ভাবক কোয়ালিফাইড ট্রেডিং প্ল্যাটফর্ম থেকে নেওয়া হয়েছেঃhttps://www.quantinfo.com/Tools/View/4.htmlএকটি নিবন্ধ যেখানে ট্রেডিং কৌশল প্রশিক্ষণের জন্য DRL+gym ব্যবহার করা হয়েছেঃhttps://towardsdatascience.com/visualizing-stock-trading-agents-using-matplotlib-and-gym-584c992bc6d4এখানে কিছু উদাহরণঃhttps://github.com/yunjey/pytorch-tutorialএই নিবন্ধটি সরাসরি এই LSTM-PPO মডেলের সংক্ষিপ্ত বাস্তবায়ন ব্যবহার করবেঃhttps://github.com/seungeunrho/minimalRL/blob/master/ppo-lstm.pyপিপিও সম্পর্কে নিবন্ধঃhttps://zhuanlan.zhihu.com/p/38185553ডিআরএল সম্পর্কে আরও পড়ুনঃhttps://www.zhihu.com/people/flood-sung/postsজিমের জন্য, এই নিবন্ধটি ইনস্টল করার প্রয়োজন নেই, তবে রিইনফোর্সমেন্ট লার্নিং খুব সাধারণঃhttps://gym.openai.com/

৩.এলএসটিএম-পিপিও

পলিসি গ্রাইড্যান্টের ক্ষেত্রে, ইনপুট করা পরিবেশগত তথ্যের ভিত্তিতে বিভিন্ন ক্রিয়াকলাপের সম্ভাব্যতা দেওয়া যেতে পারে। পলিসি গ্রাইড্যান্টের ক্ষতি হ'ল পূর্বাভাস মূল্য এবং প্রকৃত মূল্যের মধ্যে পার্থক্য, যখন পিজি-এর ক্ষতি হ'ল - লগ§*Q, যেখানে পি হ'ল আউটপুট একটি ক্রিয়াকলাপের সম্ভাব্যতা, Q এই ক্রিয়াকলাপের জন্য মূল্য যেমন পুরষ্কারের স্কোর) । একটি স্বজ্ঞাত ব্যাখ্যা হ'ল যদি কোনও ক্রিয়াকলাপের মান বেশি হয় তবে নেটওয়ার্কটি উচ্চতর সম্ভাব্যতা আউটপুট করে। যদিও পিজিপিওর মূল নীতিটি অনেকটা জটিল, তবে এটি আরও গুরুত্বপূর্ণ যে কীভাবে মূল্য নির্ধারণ করা যায় এবং প্রতিটি প্যারামিটার কীভাবে আরও ভালভাবে আপডেট করা যায়।

নীচে LSTM-PPO এর উৎস কোড দেওয়া হয়েছে, যা পূর্ববর্তী তথ্যগুলির সাথে সংযুক্ত করা যেতে পারেঃ


import time
import requests
import json
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.distributions import Categorical
from itertools import count

#模型的超参数
learning_rate = 0.0005
gamma         = 0.98
lmbda         = 0.95
eps_clip      = 0.1
K_epoch       = 3

device = torch.device('cpu') # 也可以改为GPU版本

class PPO(nn.Module):
    def __init__(self, state_size, action_size):
        super(PPO, self).__init__()
        self.data = []
        self.fc1   = nn.Linear(state_size,10)
        self.lstm  = nn.LSTM(10,10)
        self.fc_pi = nn.Linear(10,action_size)
        self.fc_v  = nn.Linear(10,1)
        self.optimizer = optim.Adam(self.parameters(), lr=learning_rate)

    def pi(self, x, hidden):
        #输出各个动作的概率,由于是LSTM网络还要包含hidden层的信息,可以参考上一期文章
        x = F.relu(self.fc1(x))
        x = x.view(-1, 1, 10)
        x, lstm_hidden = self.lstm(x, hidden)
        x = self.fc_pi(x)
        prob = F.softmax(x, dim=2)
        return prob, lstm_hidden
    
    def v(self, x, hidden):
        #价值函数,用于评价当前局面的好坏,所以只有一个输出
        x = F.relu(self.fc1(x))
        x = x.view(-1, 1, 10)
        x, lstm_hidden = self.lstm(x, hidden)
        v = self.fc_v(x)
        return v
      
    def put_data(self, transition):
        self.data.append(transition)
        
    def make_batch(self):
        #准备训练数据
        s_lst, a_lst, r_lst, s_prime_lst, prob_a_lst, hidden_lst, done_lst = [], [], [], [], [], [], []
        for transition in self.data:
            s, a, r, s_prime, prob_a, hidden, done = transition
            s_lst.append(s)
            a_lst.append([a])
            r_lst.append([r])
            s_prime_lst.append(s_prime)
            prob_a_lst.append([prob_a])
            hidden_lst.append(hidden)
            done_mask = 0 if done else 1
            done_lst.append([done_mask])
            
        s,a,r,s_prime,done_mask,prob_a = torch.tensor(s_lst, dtype=torch.float), torch.tensor(a_lst), \
                                         torch.tensor(r_lst), torch.tensor(s_prime_lst, dtype=torch.float), \
                                         torch.tensor(done_lst, dtype=torch.float), torch.tensor(prob_a_lst)
        self.data = []
        return s,a,r,s_prime, done_mask, prob_a, hidden_lst[0]
        
    def train_net(self):
        s,a,r,s_prime,done_mask, prob_a, (h1,h2) = self.make_batch()
        first_hidden = (h1.detach(), h2.detach())

        for i in range(K_epoch):
            v_prime = self.v(s_prime, first_hidden).squeeze(1)
            td_target = r + gamma * v_prime * done_mask
            v_s = self.v(s, first_hidden).squeeze(1)
            delta = td_target - v_s
            delta = delta.detach().numpy()
            
            advantage_lst = []
            advantage = 0.0
            for item in delta[::-1]:
                advantage = gamma * lmbda * advantage + item[0]
                advantage_lst.append([advantage])
            advantage_lst.reverse()
            advantage = torch.tensor(advantage_lst, dtype=torch.float)

            pi, _ = self.pi(s, first_hidden)
            pi_a = pi.squeeze(1).gather(1,a)
            ratio = torch.exp(torch.log(pi_a) - torch.log(prob_a))  # a/b == log(exp(a)-exp(b))

            surr1 = ratio * advantage
            surr2 = torch.clamp(ratio, 1-eps_clip, 1+eps_clip) * advantage
            loss = -torch.min(surr1, surr2) + F.smooth_l1_loss(v_s, td_target.detach()) #同时训练了价值网络和决策网络

            self.optimizer.zero_grad()
            loss.mean().backward(retain_graph=True)
            self.optimizer.step()

4.比特币回测环境

জিমের ফরম্যাটের অনুকরণ করে, একটি রিসেট ইনিশিয়েটালাইজেশন পদ্ধতি রয়েছে, স্টেপ ইনপুট অ্যাকশন, ফলাফল ফেরত ((পরবর্তী অবস্থা, অ্যাকশন লাভ, শেষ হয়েছে কি না, অতিরিক্ত তথ্য)), পুরো রিসেট পরিবেশটিও 60 টি লাইনে রয়েছে, যা স্বয়ংক্রিয়ভাবে আরও জটিল সংস্করণে সংশোধন করা যেতে পারে, নির্দিষ্ট কোডঃ

class BitcoinTradingEnv:
    def __init__(self, df, commission=0.00075,  initial_balance=10000, initial_stocks=1, all_data = False, sample_length= 500):
        self.initial_stocks = initial_stocks #初始的比特币数量
        self.initial_balance = initial_balance #初始的资产
        self.current_time = 0 #回测的时间位置
        self.commission = commission #易手续费
        self.done = False #回测是否结束
        self.df = df
        self.norm_df = 100*(self.df/self.df.shift(1)-1).fillna(0) #标准化方法,简单的收益率标准化
        self.mode = all_data # 是否为抽样回测模式
        self.sample_length = 500 # 抽样长度
        
    def reset(self):
        self.balance = self.initial_balance
        self.stocks = self.initial_stocks
        self.last_profit = 0
        
        if self.mode:
            self.start = 0
            self.end = self.df.shape[0]-1
        else:
            self.start = np.random.randint(0,self.df.shape[0]-self.sample_length)
            self.end = self.start + self.sample_length
            
        self.initial_value = self.initial_balance + self.initial_stocks*self.df.iloc[self.start,4]
        self.stocks_value = self.initial_stocks*self.df.iloc[self.start,4]
        self.stocks_pct = self.stocks_value/self.initial_value
        self.value = self.initial_value
        
        self.current_time = self.start
        return np.concatenate([self.norm_df[['o','h','l','c','v']].iloc[self.start].values , [self.balance/10000, self.stocks/1]])
    
    def step(self, action):
        #action即策略采取的动作,这里将更新账户和计算reward
        done = False
        if action == 0: #持有
            pass
        elif action == 1: #买入
            buy_value = self.balance*0.5
            if buy_value > 1: #余钱不足,不操作账户
                self.balance -= buy_value
                self.stocks += (1-self.commission)*buy_value/self.df.iloc[self.current_time,4]
        elif action == 2: #卖出
            sell_amount = self.stocks*0.5
            if sell_amount > 0.0001:
                self.stocks -= sell_amount
                self.balance += (1-self.commission)*sell_amount*self.df.iloc[self.current_time,4]
                
        self.current_time += 1
        if self.current_time == self.end:
            done = True
        self.value = self.balance + self.stocks*self.df.iloc[self.current_time,4]
        self.stocks_value = self.stocks*self.df.iloc[self.current_time,4]
        self.stocks_pct = self.stocks_value/self.value
        if self.value < 0.1*self.initial_value:
            done = True
            
        profit = self.value - (self.initial_balance+self.initial_stocks*self.df.iloc[self.current_time,4])
        reward = profit - self.last_profit # 每回合的reward是新增收益
        self.last_profit = profit
        next_state = np.concatenate([self.norm_df[['o','h','l','c','v']].iloc[self.current_time].values , [self.balance/10000, self.stocks/1]])
        return (next_state, reward, done, profit)

5.几个值得注意的细节

প্রথম অ্যাকাউন্টে কেন মুদ্রা ছিল?

রিভিশন পরিবেশের রিটার্ন গণনার সূত্রটি হলঃ বর্তমান আয় = বর্তমান অ্যাকাউন্টের মূল্য - প্রাথমিক অ্যাকাউন্টের বর্তমান মূল্য। এর অর্থ হল, যদি বিটকয়েনের দাম কমে যায় এবং কৌশলটি মুদ্রা বিক্রয় করে, এমনকি যদি মোট অ্যাকাউন্টের মূল্য হ্রাস পায় তবে কৌশলটি আসলে পুরস্কৃত করা উচিত। যদি রিভিশন সময় দীর্ঘ হয় তবে প্রাথমিক অ্যাকাউন্টটি খুব কম প্রভাব ফেলতে পারে তবে শুরুতে এটি একটি বড় প্রভাব ফেলতে পারে। তুলনামূলক আয় গণনা নিশ্চিত করে যে প্রতিটি সঠিক ক্রিয়াকলাপের জন্য ইতিবাচক পুরষ্কার রয়েছে।

কেন প্রশিক্ষণের সময় নমুনা নেওয়া হয়?

মোট তথ্যের পরিমাণ ১০,০০০ এরও বেশি কে-লাইন, যদি প্রতিবার পুরো পরিমাণে একটি লুপ চালানো হয়, তবে দীর্ঘ সময় লাগবে এবং কৌশলটি প্রতিবার একই পরিস্থিতির মুখোমুখি হয়, তবে এটি সহজেই ওভারফিট হতে পারে। প্রতিবার 500 টিরও বেশি বের করে একবারের জন্য ডেটা পুনরাবৃত্তি করার জন্য, যদিও এখনও ওভারফিট হওয়ার সম্ভাবনা রয়েছে, তবে কৌশলটি দশ হাজারেরও বেশি সম্ভাব্য সূচনার মুখোমুখি হয়।

আপনি কি জানেন যে, আপনি যদি কোন মুদ্রা বা টাকা না পান তাহলে কি করবেন?

রিভিশন পরিবেশে এই পরিস্থিতি বিবেচনা করা হয় না, যদি মুদ্রা বিক্রি হয়ে যায় বা সর্বনিম্ন লেনদেনের পরিমাণে পৌঁছায় না, তখন বিক্রয় অপারেশন সম্পাদন করা কার্যত অপারেশন না করার সমতুল্য। যদি দাম হ্রাস পায়, তবে আপেক্ষিক উপার্জনের গণনার পদ্ধতি অনুসারে কৌশলটি এখনও ইতিবাচক পুরষ্কারের উপর ভিত্তি করে। এই পরিস্থিতির প্রভাব কৌশলটি বাজারের পতন এবং অ্যাকাউন্টের মুদ্রার ভারসাম্য বিক্রি করতে অক্ষম হওয়ার ক্ষেত্রে কৌশলটি সিদ্ধান্ত নেয়।

কেন অ্যাকাউন্টের তথ্য পুনরুদ্ধার করা হচ্ছে?

পিপিও মডেলের একটি মূল্য নেটওয়ার্ক রয়েছে যা বর্তমান অবস্থার মূল্য নির্ধারণের জন্য ব্যবহৃত হয়। স্পষ্টতই, যদি কৌশলটি মূল্য বাড়ার সিদ্ধান্ত নেয় তবে বর্তমান অ্যাকাউন্টটি বিটকয়েন ধারণ করার সময় পুরো অবস্থাটি ইতিবাচক মূল্যবান হবে এবং বিপরীতভাবে। সুতরাং অ্যাকাউন্টের তথ্য মূল্য নেটওয়ার্কের সিদ্ধান্তের একটি গুরুত্বপূর্ণ ভিত্তি। নোট করুন যে এটি অতীতের ক্রিয়াকলাপের তথ্যকে অবস্থা হিসাবে ফিরিয়ে দেয় না, যা ব্যক্তিরা মূল্য নির্ধারণের জন্য অপ্রয়োজনীয় বলে মনে করে।

কোন পরিস্থিতিতে এটি আবার কাজ করবে না?

যখন কৌশলগতভাবে সিদ্ধান্ত নেওয়া হয় যে কেনা বেচা থেকে লাভের পরিমাণ অপারেশন ফি কভার করতে পারে না, তখন অপারেশনটি করা উচিত নয়। যদিও পূর্ববর্তী বর্ণনাটি বারবার কৌশলগতভাবে মূল্যের প্রবণতা নির্ধারণ করে, তবে এটি বোঝার জন্য, এই পিপিও মডেলটি আসলে বাজারের পূর্বাভাস দেয় না, কেবলমাত্র তিনটি পদক্ষেপের সম্ভাব্যতা প্রকাশ করে।

6.数据的获取和训练

পূর্ববর্তী নিবন্ধের মতো, বিটফিনেক্স এক্সচেঞ্জের বিটিসি_ইউএসডি ট্রেডিং 2018/5/7 থেকে 2019/6/27 পর্যন্ত এক ঘন্টার চক্রের জন্য K লাইন হিসাবে ডেটা প্রাপ্তির পদ্ধতি এবং বিন্যাস নিম্নরূপঃ

resp = requests.get('https://www.quantinfo.com/API/m/chart/history?symbol=BTC_USD_BITFINEX&resolution=60&from=1525622626&to=1561607596')
data = resp.json()
df = pd.DataFrame(data,columns = ['t','o','h','l','c','v'])
df.index = df['t']
df = df.dropna()
df = df.astype(np.float32)

লসটিএম নেটওয়ার্ক ব্যবহার করার কারণে, প্রশিক্ষণের সময়টি দীর্ঘ ছিল, তাই আমি জিপিইউ সংস্করণটি প্রায় তিনগুণ দ্রুত পরিবর্তন করেছি।

env = BitcoinTradingEnv(df)
model = PPO()

total_profit = 0 #记录总收益
profit_list = [] #记录每次训练收益
for n_epi in range(10000):
    hidden = (torch.zeros([1, 1, 32], dtype=torch.float).to(device), torch.zeros([1, 1, 32], dtype=torch.float).to(device))
    s = env.reset()
    done = False
    buy_action = 0
    sell_action = 0
    while not done:
        h_input = hidden
        prob, hidden = model.pi(torch.from_numpy(s).float().to(device), h_input)
        prob = prob.view(-1)
        m = Categorical(prob)
        a = m.sample().item()
        if a==1:
            buy_action += 1
        if a==2:
            sell_action += 1
        s_prime, r, done, profit = env.step(a)

        model.put_data((s, a, r/10.0, s_prime, prob[a].item(), h_input, done))
        s = s_prime

    model.train_net()
    profit_list.append(profit)
    total_profit += profit
    if n_epi%10==0:
        print("# of episode :{:<5}, profit : {:<8.1f}, buy :{:<3}, sell :{:<3}, total profit: {:<20.1f}".format(n_epi, profit, buy_action, sell_action, total_profit))

7.训练结果和分析

দীর্ঘ অপেক্ষার পরঃimg

প্রথমত, ট্রেনিং ডেটার দিকে নজর দিন, সাধারণত প্রথমার্ধে একটি দীর্ঘ পতন এবং দ্বিতীয়ার্ধে একটি শক্তিশালী প্রত্যাবর্তন ঘটে।img

প্রশিক্ষণের আগে ক্রয় অপারেশন অনেক, মূলত লাভজনক চক্র নেই. প্রশিক্ষণের মাঝামাঝি ক্রয় অপারেশন ধীরে ধীরে হ্রাস পায়, লাভের সম্ভাবনাও আরও বেশি হয়, তবে ক্ষতির সম্ভাবনা খুব বেশি থাকে।img

প্রতি রাউন্ডে আয়কে মসৃণ করে, ফলাফলটি হলঃimg

কৌশলটি দ্রুত পূর্বের নেতিবাচক লাভের পরিস্থিতি থেকে বেরিয়ে আসে, তবে ওঠানামা বেশি হয় এবং 10,000 টি চক্রের পরে পর্যন্ত লাভ দ্রুত বৃদ্ধি পায় না, মোটামুটিভাবে, মডেল প্রশিক্ষণ কঠিন।

চূড়ান্ত প্রশিক্ষণের পরে, মডেলটি সমস্ত ডেটা একবারে চালিয়ে দেখবে যে এটি কীভাবে কাজ করে, অ্যাকাউন্টের মোট বাজারমূল্য, বিটকয়েনের সংখ্যা, বিটকয়েন মূল্যের অনুপাত, মোট উপার্জন রেকর্ড করে। প্রথমত, মোট বাজারমূল্য, মোট আয় এবং এর অনুরূপ, এটি বাদ দেওয়া হয়ঃimg
সামগ্রিক বাজারমূল্য ধীরে ধীরে বৃদ্ধি পেয়েছে, তবে ধীরে ধীরে হ্রাস পেয়েছে।

অবশেষে, হোল্ডিং অনুপাত দেখুন, চিত্রে বাম অক্ষ হোল্ডিং অনুপাত, ডান অক্ষ হ'ল বাজার, আপনি প্রাথমিকভাবে সিদ্ধান্ত নিতে পারেন যে মডেলটি খুব বেশি ফিট হয়ে গেছে, প্রথম দিকে ভালুকের সময় হোল্ডিংয়ের ফ্রিকোয়েন্সি কম, বাজারের নীচে হোল্ডিংয়ের ফ্রিকোয়েন্সি খুব বেশি। আপনি দেখতে পারেন যে মডেলটি দীর্ঘমেয়াদী হোল্ডিং শিখতে পারেনি, সর্বদা দ্রুত বিক্রি হয়।img

8.测试数据分析

টেস্টের তথ্য প্রাপ্তির সময় ২০১৯/৬/২৭ তারিখ পর্যন্ত বিটকয়েনের এক ঘণ্টার বাজার। চার্টটিতে দেখা যাচ্ছে যে দাম শুরুতে ১৩,০০০ ডলার থেকে নেমে এসেছে এবং এখন ৯,০০০ ডলারেরও বেশি, যা মডেলের জন্য একটি বড় পরীক্ষা।img

প্রথমত, শেষ পর্যন্ত তুলনামূলক লাভ, দুর্বল পারফরম্যান্স, কিন্তু কোনও ক্ষতিও নয়।img

বিটকয়েন বাজারে সাম্প্রতিক সময়ে সামান্য অস্থিরতা রয়েছে এবং মডেলটি সর্বদা খালি অবস্থায় রয়েছে।img

9.总结

এই নিবন্ধটি একটি বিটকয়েন স্বয়ংক্রিয় ট্রেডিং রোবটকে গভীর শক্তিশালীকরণ শেখার পদ্ধতির সাহায্যে প্রশিক্ষিত পিপিও-র সাথে কিছু সিদ্ধান্তও পেয়েছে। সীমিত সময়ের কারণে, মডেলটিতে আরও কিছু উন্নতি করার জায়গা রয়েছে, সবাই আলোচনা করার জন্য স্বাগত জানাই। এর মধ্যে সবচেয়ে বড় পাঠ হ'ল ডেটা স্ট্যান্ডার্ডাইজেশন পদ্ধতি, স্কেলিংয়ের মতো পদ্ধতি গ্রহণ করবেন না, অন্যথায় মডেলটি দ্রুত দাম এবং বাজারের সম্পর্কগুলি মনে রাখবে এবং ফিট হয়ে যাবে। পরিবর্তনের হার স্ট্যান্ডার্ডাইজেশনের পরে আপেক্ষিক ডেটা, যা মডেলকে ট্রেডিংয়ের সাথে সম্পর্কগুলি মনে রাখা কঠিন করে তোলে এবং পরিবর্তনের হার এবং পতনের সাথে সম্পর্ক খুঁজে পেতে বাধ্য করে।

পূর্ববর্তী নিবন্ধআলোচনাঃ এফএমজেড-এর উদ্ভাবকরা তাদের পরিমাণগত প্ল্যাটফর্মে কিছু প্রকাশ্য কৌশল শেয়ার করেছেনঃhttps://zhuanlan.zhihu.com/p/64961672নেটওয়ার্ক ক্লাউড ক্লাসের ডিজিটাল মুদ্রার পরিমাণগত লেনদেনের কোর্সটি মাত্র ২০ ডলারেঃhttps://study.163.com/course/courseMain.htm?courseId=1006074239&share=2&shareId=400000000602076আমি একটি উচ্চ-প্রবাহ কৌশল প্রকাশ করেছি যা আগে খুব লাভজনক ছিলঃhttps://www.fmz.com/bbs-topic/1211


সম্পর্কিত

আরো

লিসা ২০২৩১আপনি কেন পরীক্ষার ফলাফলের ছবি উল্টে দিচ্ছেন? কেন ডলার যখন দাম বাড়বে তখন আপনার আয় কমবে?

জ্যাকমাprofit = self.value - (self.initial_balance+self.initial_stocks * self.df.iloc[self.current_time,4]) একটি বাগ আছে এটি হওয়া উচিতঃ লাভ = self.value - (self.initial_balance+self.initial_stocks * self.df.iloc[self.start,4])

জ্যাকমাprofit = self.value - (self.initial_balance+self.initial_stocks*self.df.iloc[self.current_time,4]) একটি বাগ আছে এটি হওয়া উচিতঃ profit = self.value - (self.initial_balance+self.initial_stocks*self.df.iloc[self.start,4])

টিমোশেঙ্কোপ্রথম সংস্করণের তুলনায় অনেক বেশি শক্তিশালী।

xw2021গম্ভীর!

এডিঘাসের দেবতা গরু!

ঘাসজিপিইউ `` ডিভাইস = torch.device (('cuda' if torch.cuda.is_available (() else 'cpu') class PPO ((nn.Module): def __init__ ((self): super ((PPO, self).__init__() self.data = [] আমি জানি self.fc1 = nn.Linear ((8,64) self.lstm = nn.LSTM ((64,32) self.fc_pi = nn.Linear ((32,3) self.fc_v = nn.Linear ((32,1) self.optimizer = optim.Adam ((self.parameters ((), lr=learning_rate)) def pi ((self, x, hidden): x = F.relu ((self.fc1 ((x)) x = x.view ((-1, 1, 64) x, lstm_hidden = self.lstm ((x, hidden)) x = self.fc_pi ((x) prob = F.softmax ((x, dim=2) রিটার্ন প্রোব, lstm_hidden আমি জানি def v ((self, x, hidden): x = F.relu ((self.fc1 ((x)) x = x.view ((-1, 1, 64) x, lstm_hidden = self. lstm ((x, hidden)) v = self.fc_v ((x) return v আমি জানি def put_data ((self, transition): self.data.append ((transition)) আমি জানি def make_batch ((self): s_lst, a_lst, r_lst, s_prime_lst, prob_a_lst, hidden_lst, done_lst = [], [], [], [], [], [], [] for transition in self.data: স্বয়ং. ডেটাতে ট্রানজিশনের জন্য s, a, r, s_prime, prob_a, hidden, done = ট্রানজিশন আমি জানি s_lst.append ((s) a_lst.append (([a]) r_lst.append (([r]) s_prime_lst.append ((s_prime) prob_a_lst.append (([prob_a]) hidden_lst.append ((hidden)) লুকানো done_mask = 0 if done else 1 done_lst.append (([done_mask]) আমি জানি s,a,r,s_prime,done_mask,prob_a = torch.tensor ((s_lst,dtype=torch.float).to ((device),torch.tensor ((a_lst).to ((device).to ((device), \ torch.tensor ((r_lst).to ((device), torch.tensor ((s_prime_lst, dtype=torch.float).to ((device), \ torch.tensor ((done_lst, dtype=torch.float).to ((device), torch.tensor ((prob_a_lst).to ((device) self.data = [] return s,a,r,s_prime, done_mask, prob_a, hidden_lst[0] আমি জানি def train_net ((self): s,a,r,s_prime,done_mask,prob_a, (h1,h2) = self.make_batch (()) first_hidden = (h1.to ((device).detach ((), h2.to ((device).detach (()) for i in range ((K_epoch): v_prime = self.v ((s_prime, first_hidden).squeeze))) td_target = r + গামা * v_prime * done_mask v_s = self.v ((s, first_hidden).squeeze ((1) delta = td_target - v_s delta = delta.cpu (().detach (().numpy (()) advantage_lst = [] advantage = ০.০ for item in delta [::-1]: advantage = গামা * lmbda * advantage + item[0] advantage_lst.append (([advantage]) advantage_lst.reverse (() advantage = torch.tensor ((advantage_lst, dtype=torch.float).to ((device)) pi, _ = self. pi ((s, first_hidden) pi_a = pi.squeeze ((1).gather ((1,a) ratio = torch.exp ((torch.log ((pi_a) - torch.log ((prob_a)) # a/b == log ((exp ((a) -exp ((b)) surr1 = অনুপাত * সুবিধা surr2 = torch.clamp ((ratio, 1-eps_clip, 1+eps_clip) * advantage loss = -torch.min ((surr1, surr2) + F.smooth_l1_loss ((v_s, td_target.detach)) self.optimizer.zero_grad ((() loss.mean (().backward ((retain_graph=True)) self.optimizer.step ((() ``