وسائل لوڈ ہو رہے ہیں... لوڈنگ...

اعصابی نیٹ ورک اور ڈیجیٹل کرنسی کی مقدار کی تجارت کی سیریز ((2) گہرائی میں مضبوط سیکھنے کی تربیت بٹ کوائن ٹریڈنگ کی حکمت عملی

مصنف:گھاس, تخلیق: 2019-07-31 11:13:15, تازہ کاری: 2024-12-19 21:00:03

img

1.介绍

پچھلا مضمونبٹ کوائن کی قیمت کی پیشن گوئی کرنے کے لئے ایل ایس ٹی ایم نیٹ ورک کا استعمال کرتے ہوئےhttps://www.fmz.com/digest-topic/4035جیسا کہ مضمون میں ذکر کیا گیا ہے ، یہ صرف ایک چھوٹا سا پروجیکٹ ہے جو RNN اور pytorch کے ساتھ واقف کرنے کے لئے استعمال کیا جاتا ہے۔ اس مضمون میں مضبوطی سے سیکھنے کے طریقوں کا استعمال کیا جائے گا ، براہ راست تجارتی حکمت عملی کی تربیت کی جائے گی۔ مضبوطی سے سیکھنے کا ماڈل اوپن اے آئی اوپن سورس پی پی او ہے ، اور ماحول جم کے انداز کا حوالہ دیتا ہے۔ آسانی سے سمجھنے اور جانچنے کے ل the ، ایل ایس ٹی ایم کا پی پی او ماڈل اور ریویوڈ جم ماحول دونوں براہ راست تیار شدہ پیکجوں کو لکھتے ہیں جن کا استعمال نہیں کیا جاتا ہے۔ پی پی او ، جس کا مکمل نام Proximal Policy Optimization ہے ، Policy Graident ، یعنی حکمت عملی کے ترازو میں ایک اصلاحی بہتری ہے۔ جم بھی اوپن اے آئی کے ذریعہ جاری کیا گیا ہے ، جو حکمت عملی کے نیٹ ورک کے ساتھ تعامل کرسکتا ہے ، موجودہ ماحول کی حالت اور انعامات کو رائے دیتا ہے ، جیسے تقویت یافتہ سیکھنے کی مشقیں ، ایل ایس ٹی ایم کا استعمال کرتے ہوئے پی پی او ماڈل کا استعمال کرتے ہوئے ، براہ راست بٹ کوائن کی مارکیٹ کی معلومات کے مطابق خریدنے ، فروخت کرنے یا غیر فعال کرنے کے احکامات بناتے ہیں ، جو بیک ٹیسٹ ماحول کی طرف سے رائے دیتے ہیں ، اور اس مقصد کو حاصل کرنے کے لئے حکمت عملی کے منافع کو مسلسل بہتر بنانے کے لئے ماڈل کو تربیت دیتے ہیں۔ اس مضمون کو پڑھنے کے لئے کچھ پائتن ، پائیٹورچ ، ڈی آر ایل کی گہری سیکھنے کی بنیاد کی ضرورت ہے۔ لیکن اس سے کوئی فرق نہیں پڑتا ہے ، اس مضمون میں دیئے گئے کوڈ کے ساتھ مل کر ، سیکھنا آسان ہے۔www.fmz.com), QQ گروپ میں خوش آمدید: 863946592 تبادلہ خیال.

2.数据和学习参考资料

بٹ کوائن کی قیمتوں کا ڈیٹا ایف ایم زیڈ کے موجدوں کی طرف سے حاصل کیا گیا ہے:https://www.quantinfo.com/Tools/View/4.htmlایک مضمون جس میں تجارت کی حکمت عملی کی تربیت کے لئے ڈی آر ایل + جم کا استعمال کیا گیا ہے: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/

3.LSTM-PPO

پی پی او کے بارے میں گہری وضاحت کے لئے، آپ کو پہلے سے ہی حوالہ جات سیکھ سکتے ہیں، یہاں صرف ایک سادہ تصورات کا تعارف ہے۔ پچھلے مرحلے میں ایل ایس ٹی ایم نیٹ ورک صرف ایک قیمت کی پیشن گوئی کرتا ہے، اور اس کی پیشن گوئی کی قیمت کے مطابق خرید و فروخت کے معاملات کو کیسے حاصل کیا جائے گا، یہ سوچنے کے لئے قدرتی ہے کہ براہ راست آؤٹ پٹ خرید و فروخت کی سرگرمیاں زیادہ براہ راست نہیں ہیں؟ پالیسی گریڈینٹ اسی طرح ہے، آپ ان پٹ ماحول کی معلومات کے مطابق مختلف قسم کے کارروائیوں کا امکان دے سکتے ہیں. ایل ایس ٹی ایم کے نقصانات پی پی او کی قیمت اور اصل قیمت کے درمیان فرق ہیں، جبکہ پی جی کے نقصانات - لاگ § * 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.几个值得注意的细节

اس کے علاوہ ، یہ بھی کہا گیا ہے کہ یہ ایک بہت بڑا مسئلہ ہے۔

ریویو کے ماحول میں منافع کا حساب لگانے کا فارمولا یہ ہے: موجودہ آمدنی = موجودہ اکاؤنٹ کی قیمت - ابتدائی اکاؤنٹ کی موجودہ قیمت۔ اس کا مطلب یہ ہے کہ اگر بٹ کوائن کی قیمت میں کمی واقع ہوتی ہے اور حکمت عملی نے سکے فروخت کرنے کی کارروائی کی ہے تو ، یہاں تک کہ اگر مجموعی اکاؤنٹ کی قیمت کم ہوجاتی ہے تو ، حقیقت میں حکمت عملی کے ساتھ انعام دیا جانا چاہئے۔ اگر ریویو کا وقت لمبا ہے تو ، ابتدائی اکاؤنٹ کا تھوڑا سا اثر پڑ سکتا ہے ، لیکن ابتدائی طور پر اس کا اثر بہت زیادہ ہوتا ہے۔ رشتہ دار آمدنی کا حساب لگانے سے اس بات کا یقین ہوتا ہے کہ ہر صحیح کارروائی پر مثبت انعام ملتا ہے۔

ٹریننگ کے دوران نمونہ کیوں لیا جاتا ہے؟

مجموعی اعداد و شمار کی مقدار 10،000 سے زیادہ K لائنز ہے ، اگر ہر بار ایک لوپ چلتا ہے تو ، اس میں بہت زیادہ وقت لگتا ہے ، اور حکمت عملی ہر بار ایک جیسی ہی صورتحال کا سامنا کرتی ہے تو ، اس سے زیادہ فٹ ہونا آسان ہوسکتا ہے۔ ہر بار 500 سے زیادہ نکالنے کے لئے ایک بار دوبارہ ڈیٹا ، اگرچہ اب بھی فٹ ہونے کا امکان ہے ، لیکن حکمت عملی کو 10،000 سے زیادہ مختلف ممکنہ آغاز کا سامنا کرنا پڑتا ہے۔

اگر آپ کے پاس پیسہ نہیں ہے تو کیا کریں؟

ریویو کے ماحول میں اس صورت حال کو مدنظر نہیں رکھا جاتا ہے ، اگر سکے فروخت ہوچکے ہیں یا کم سے کم تجارتی حجم تک نہیں پہنچ پائے ہیں تو ، اس وقت فروخت کرنے کی کارروائی کو انجام دینا عملی طور پر عمل نہ کرنے کے مترادف ہے ، اگر قیمت میں کمی واقع ہوتی ہے تو ، رشتہ دار منافع کے حساب کے مطابق ، حکمت عملی کی بنیاد پر ابھی بھی مثبت انعام ہے۔ اس صورت حال کا اثر یہ ہے کہ جب حکمت عملی مارکیٹ میں کمی کا فیصلہ کرتی ہے اور اکاؤنٹ میں سکے کا بیلنس فروخت نہیں کیا جاسکتا ہے تو ، فروخت کرنے اور غیر فعال کرنے کی کارروائی میں فرق نہیں ہوسکتا ہے ، لیکن حکمت عملی کے اپنے فیصلے پر اثر نہیں پڑتا ہے۔

آپ کے اکاؤنٹ کی معلومات کو واپس کرنے کی ضرورت کیوں ہے؟

پی پی او ماڈل میں ایک ویلیو نیٹ ورک موجود ہے جس کا استعمال موجودہ حالت کی قیمت کا اندازہ کرنے کے لئے کیا جاتا ہے ، واضح طور پر اگر حکمت عملی قیمت میں اضافے کا فیصلہ کرتی ہے تو ، موجودہ اکاؤنٹ میں بٹ کوائن رکھنے کے وقت ہی پوری حالت کی مثبت قیمت ہوتی ہے ، اور اس کے برعکس۔ لہذا اکاؤنٹ کی معلومات ویلیو نیٹ ورک کے فیصلے کی ایک اہم بنیاد ہیں۔ نوٹ کریں کہ ماضی کی حرکت کی معلومات کو حالت کے طور پر واپس نہیں کیا جاتا ہے ، جو انفرادی طور پر اس قدر کے فیصلے کے لئے بیکار ہے۔

کیا آپ کو لگتا ہے کہ آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے؟

جب حکمت عملی کے مطابق خرید و فروخت سے حاصل ہونے والی آمدنی میں عملدرآمد کی فیسوں کا احاطہ نہیں کیا جاسکتا ہے تو ، آپ کو عملدرآمد نہیں کرنا چاہئے۔ اگرچہ مندرجہ بالا بیان میں بار بار حکمت عملی کے مطابق قیمتوں کے رجحانات کا اندازہ لگایا گیا ہے ، لیکن صرف اس بات کی آسانی کے لئے کہ یہ پی پی او ماڈل حقیقت میں مارکیٹ کی پیش گوئی نہیں کرتا ہے ، صرف تین حرکتوں کی امکانات کو آؤٹ پٹ کرتا ہے۔

6.数据的获取和训练

جیسا کہ پچھلے مضمون میں ، اعداد و شمار کو حاصل کرنے کا طریقہ اور شکل مندرجہ ذیل ہے ، Bitfinex ایکسچینج BTC_USD ٹریڈنگ کے لئے ایک گھنٹہ کے دورانیے K لائن پر 2018/5/7 سے 2019/6/27 تک:

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)

میں نے ایک اور GPU ورژن تبدیل کیا جو تقریبا 3 گنا تیز تھا کیونکہ LSTM نیٹ ورک کا استعمال کرتے ہوئے تربیت کا وقت بہت طویل تھا۔

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.测试数据分析

ٹیسٹ کے اعداد و شمار حاصل کرنے کے وقت سے لے کر 27 جون 2019 تک بٹ کوائن کی ایک گھنٹہ کی مارکیٹ۔ چارٹ میں دیکھا جاسکتا ہے کہ قیمت شروع میں 13،000 ڈالر سے گر کر آج 9،000 ڈالر سے زیادہ ہوگئی ہے ، جو ماڈل کے لئے ایک بہت بڑا امتحان ہے۔img

اس کے علاوہ ، اس نے اپنے صارفین کو بتایا کہ اس نے اپنے صارفین کے لئے ایک نیا ورژن تیار کیا ہے۔img

اگر آپ ہولڈنگ کی صورت حال کو دیکھیں تو یہ اندازہ لگایا جاسکتا ہے کہ ماڈل تیزی سے گرنے کے بعد خریدنے اور فروخت کرنے کا رجحان رکھتا ہے۔ حالیہ عرصے میں ، بٹ کوائن مارکیٹ میں بہت کم اتار چڑھاؤ رہا ہے ، اور ماڈل خالی ہولڈنگ کی حالت میں رہا ہے۔img

9.总结

اس مضمون میں ، پی پی او نے ایک بٹ کوائن خودکار ٹریڈنگ روبوٹ کو گہری تقویت یافتہ سیکھنے کے طریقہ کار کی مدد سے تربیت دی ، اور کچھ نتائج برآمد ہوئے۔ چونکہ وقت محدود ہے ، اس ماڈل میں بہتری کی کچھ جگہیں ہیں ، آپ سب کو اس پر بات کرنے کا خیرمقدم کرتے ہیں۔ اس میں سے سب سے بڑا سبق یہ ہے کہ اعداد و شمار کو معیاری بنانا ہے ، اسکیل اپ جیسے طریقوں کا استعمال نہ کریں ، ورنہ ماڈل تیزی سے قیمتوں اور مارکیٹوں کے تعلقات کو یاد رکھے گا ، اور فٹ بیٹھ جائے گا۔ شرح تبدیلی کی معیاری کاری کے بعد نسبتا data اعداد و شمار ہیں ، جس سے ماڈل کو رجحانات کے تعلقات کو یاد رکھنا مشکل ہوجاتا ہے ، اور اسے شرح تبدیلی اور اتار چڑھاؤ کے تعلقات تلاش کرنے پر مجبور کیا جاتا ہے۔

Previous articleپہلے کے مضامین: ایف ایم زیڈ کے تخلیق کاروں نے اپنی مقدار سازی کے پلیٹ فارم پر کچھ کھلی حکمت عملی شیئر کیں:https://zhuanlan.zhihu.com/p/64961672نیٹ ایزی کلاؤڈ کلاس میں ڈیجیٹل کرنسی کی مقدار میں تجارت کا کورس صرف 20 ڈالر میں:https://study.163.com/course/courseMain.htm?courseId=1006074239&share=2&shareId=400000000602076ایک بار میں نے ایک اعلی تعدد کی حکمت عملی کا اعلان کیا ہے جو ایک بار میں بہت منافع بخش تھا:https://www.fmz.com/bbs-topic/1211


متعلقہ

مزید

لیزا20231کیا آپ نے کبھی سوچا ہے کہ آپ نے اپنے ٹیسٹ کے نتائج کی تصاویر کو اوپر کی طرف کیوں پلٹایا؟ جب ڈالر کی قیمت بڑھتی ہے تو آپ کی آمدنی کیوں کم ہوتی ہے؟

جیکما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]) ایک بگ ہے یہ ہونا چاہئے: منافع = self.value - (self.initial_balance+self.initial_stocks*self.df.iloc[self.start،4])

تیموشینکوپہلی ایڈیشن سے کہیں زیادہ مضبوط

xw2021زبردست!

ایڈیگھاس کے دیوتا گائے کا ڈھیر!

گھاسجی پی یو ورژن `` device = 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) واپسی v کیا آپ جانتے ہیں؟ def put_data ((self, transition): self.data.append (ترقی) کیا آپ جانتے ہیں؟ def make_batch ((self): s_lst، a_lst، r_lst، s_prime_lst، prob_a_lst، hidden_lst، done_lst = []، []، []، []، []، [] 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 (پوشیدہ) 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 ((1) td_target = r + گاما * v_prime * done_mask v_s = self.v ((s، first_hidden).squeeze ((1) ڈیلٹا = td_target - v_s ڈیلٹا = ڈیلٹا.سی پی یو. advantage_lst = [] فائدہ = 0.0 for item in delta [:: - 1]: فائدہ = گاما * lmbda * فائدہ + آئٹم[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) * فائدہ 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 ((() ``