پچھلا مضمونبٹ کوائن کی قیمت کی پیشن گوئی کرنے کے لئے ایل ایس ٹی ایم نیٹ ورک کا استعمال کرتے ہوئےhttps://www.fmz.com/digest-topic/4035جیسا کہ مضمون میں ذکر کیا گیا ہے ، یہ صرف ایک چھوٹا سا پروجیکٹ ہے جو RNN اور pytorch کے ساتھ واقف کرنے کے لئے استعمال کیا جاتا ہے۔ اس مضمون میں مضبوطی سے سیکھنے کے طریقوں کا استعمال کیا جائے گا ، براہ راست تجارتی حکمت عملی کی تربیت کی جائے گی۔ مضبوطی سے سیکھنے کا ماڈل اوپن اے آئی اوپن سورس پی پی او ہے ، اور ماحول جم کے انداز کا حوالہ دیتا ہے۔ آسانی سے سمجھنے اور جانچنے کے ل the ، ایل ایس ٹی ایم کا پی پی او ماڈل اور ریویوڈ جم ماحول دونوں براہ راست تیار شدہ پیکجوں کو لکھتے ہیں جن کا استعمال نہیں کیا جاتا ہے۔ پی پی او ، جس کا مکمل نام Proximal Policy Optimization ہے ، Policy Graident ، یعنی حکمت عملی کے ترازو میں ایک اصلاحی بہتری ہے۔ جم بھی اوپن اے آئی کے ذریعہ جاری کیا گیا ہے ، جو حکمت عملی کے نیٹ ورک کے ساتھ تعامل کرسکتا ہے ، موجودہ ماحول کی حالت اور انعامات کو رائے دیتا ہے ، جیسے تقویت یافتہ سیکھنے کی مشقیں ، ایل ایس ٹی ایم کا استعمال کرتے ہوئے پی پی او ماڈل کا استعمال کرتے ہوئے ، براہ راست بٹ کوائن کی مارکیٹ کی معلومات کے مطابق خریدنے ، فروخت کرنے یا غیر فعال کرنے کے احکامات بناتے ہیں ، جو بیک ٹیسٹ ماحول کی طرف سے رائے دیتے ہیں ، اور اس مقصد کو حاصل کرنے کے لئے حکمت عملی کے منافع کو مسلسل بہتر بنانے کے لئے ماڈل کو تربیت دیتے ہیں۔ اس مضمون کو پڑھنے کے لئے کچھ پائتن ، پائیٹورچ ، ڈی آر ایل کی گہری سیکھنے کی بنیاد کی ضرورت ہے۔ لیکن اس سے کوئی فرق نہیں پڑتا ہے ، اس مضمون میں دیئے گئے کوڈ کے ساتھ مل کر ، سیکھنا آسان ہے۔www.fmz.com), QQ گروپ میں خوش آمدید: 863946592 تبادلہ خیال.
بٹ کوائن کی قیمتوں کا ڈیٹا ایف ایم زیڈ کے موجدوں کی طرف سے حاصل کیا گیا ہے: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/
پی پی او کے بارے میں گہری وضاحت کے لئے، آپ کو پہلے سے ہی حوالہ جات سیکھ سکتے ہیں، یہاں صرف ایک سادہ تصورات کا تعارف ہے۔ پچھلے مرحلے میں ایل ایس ٹی ایم نیٹ ورک صرف ایک قیمت کی پیشن گوئی کرتا ہے، اور اس کی پیشن گوئی کی قیمت کے مطابق خرید و فروخت کے معاملات کو کیسے حاصل کیا جائے گا، یہ سوچنے کے لئے قدرتی ہے کہ براہ راست آؤٹ پٹ خرید و فروخت کی سرگرمیاں زیادہ براہ راست نہیں ہیں؟ پالیسی گریڈینٹ اسی طرح ہے، آپ ان پٹ ماحول کی معلومات کے مطابق مختلف قسم کے کارروائیوں کا امکان دے سکتے ہیں. ایل ایس ٹی ایم کے نقصانات پی پی او کی قیمت اور اصل قیمت کے درمیان فرق ہیں، جبکہ پی جی کے نقصانات - لاگ § * 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()
جم کی شکل کی نقل کرتے ہوئے ، ایک ری سیٹ ابتدائیہ طریقہ کار ہے ، قدم ان پٹ حرکت ، جس کا نتیجہ ((اگلی حالت ، کارروائی کی آمدنی ، اختتام ، یا نہیں ، اضافی معلومات) کے طور پر واپس آتا ہے) ، پورے ری سیٹ ماحول میں بھی 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)
اس کے علاوہ ، یہ بھی کہا گیا ہے کہ یہ ایک بہت بڑا مسئلہ ہے۔
ریویو کے ماحول میں منافع کا حساب لگانے کا فارمولا یہ ہے: موجودہ آمدنی = موجودہ اکاؤنٹ کی قیمت - ابتدائی اکاؤنٹ کی موجودہ قیمت۔ اس کا مطلب یہ ہے کہ اگر بٹ کوائن کی قیمت میں کمی واقع ہوتی ہے اور حکمت عملی نے سکے فروخت کرنے کی کارروائی کی ہے تو ، یہاں تک کہ اگر مجموعی اکاؤنٹ کی قیمت کم ہوجاتی ہے تو ، حقیقت میں حکمت عملی کے ساتھ انعام دیا جانا چاہئے۔ اگر ریویو کا وقت لمبا ہے تو ، ابتدائی اکاؤنٹ کا تھوڑا سا اثر پڑ سکتا ہے ، لیکن ابتدائی طور پر اس کا اثر بہت زیادہ ہوتا ہے۔ رشتہ دار آمدنی کا حساب لگانے سے اس بات کا یقین ہوتا ہے کہ ہر صحیح کارروائی پر مثبت انعام ملتا ہے۔
ٹریننگ کے دوران نمونہ کیوں لیا جاتا ہے؟
مجموعی اعداد و شمار کی مقدار 10،000 سے زیادہ K لائنز ہے ، اگر ہر بار ایک لوپ چلتا ہے تو ، اس میں بہت زیادہ وقت لگتا ہے ، اور حکمت عملی ہر بار ایک جیسی ہی صورتحال کا سامنا کرتی ہے تو ، اس سے زیادہ فٹ ہونا آسان ہوسکتا ہے۔ ہر بار 500 سے زیادہ نکالنے کے لئے ایک بار دوبارہ ڈیٹا ، اگرچہ اب بھی فٹ ہونے کا امکان ہے ، لیکن حکمت عملی کو 10،000 سے زیادہ مختلف ممکنہ آغاز کا سامنا کرنا پڑتا ہے۔
اگر آپ کے پاس پیسہ نہیں ہے تو کیا کریں؟
ریویو کے ماحول میں اس صورت حال کو مدنظر نہیں رکھا جاتا ہے ، اگر سکے فروخت ہوچکے ہیں یا کم سے کم تجارتی حجم تک نہیں پہنچ پائے ہیں تو ، اس وقت فروخت کرنے کی کارروائی کو انجام دینا عملی طور پر عمل نہ کرنے کے مترادف ہے ، اگر قیمت میں کمی واقع ہوتی ہے تو ، رشتہ دار منافع کے حساب کے مطابق ، حکمت عملی کی بنیاد پر ابھی بھی مثبت انعام ہے۔ اس صورت حال کا اثر یہ ہے کہ جب حکمت عملی مارکیٹ میں کمی کا فیصلہ کرتی ہے اور اکاؤنٹ میں سکے کا بیلنس فروخت نہیں کیا جاسکتا ہے تو ، فروخت کرنے اور غیر فعال کرنے کی کارروائی میں فرق نہیں ہوسکتا ہے ، لیکن حکمت عملی کے اپنے فیصلے پر اثر نہیں پڑتا ہے۔
آپ کے اکاؤنٹ کی معلومات کو واپس کرنے کی ضرورت کیوں ہے؟
پی پی او ماڈل میں ایک ویلیو نیٹ ورک موجود ہے جس کا استعمال موجودہ حالت کی قیمت کا اندازہ کرنے کے لئے کیا جاتا ہے ، واضح طور پر اگر حکمت عملی قیمت میں اضافے کا فیصلہ کرتی ہے تو ، موجودہ اکاؤنٹ میں بٹ کوائن رکھنے کے وقت ہی پوری حالت کی مثبت قیمت ہوتی ہے ، اور اس کے برعکس۔ لہذا اکاؤنٹ کی معلومات ویلیو نیٹ ورک کے فیصلے کی ایک اہم بنیاد ہیں۔ نوٹ کریں کہ ماضی کی حرکت کی معلومات کو حالت کے طور پر واپس نہیں کیا جاتا ہے ، جو انفرادی طور پر اس قدر کے فیصلے کے لئے بیکار ہے۔
کیا آپ کو لگتا ہے کہ آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے؟
جب حکمت عملی کے مطابق خرید و فروخت سے حاصل ہونے والی آمدنی میں عملدرآمد کی فیسوں کا احاطہ نہیں کیا جاسکتا ہے تو ، آپ کو عملدرآمد نہیں کرنا چاہئے۔ اگرچہ مندرجہ بالا بیان میں بار بار حکمت عملی کے مطابق قیمتوں کے رجحانات کا اندازہ لگایا گیا ہے ، لیکن صرف اس بات کی آسانی کے لئے کہ یہ پی پی او ماڈل حقیقت میں مارکیٹ کی پیش گوئی نہیں کرتا ہے ، صرف تین حرکتوں کی امکانات کو آؤٹ پٹ کرتا ہے۔
جیسا کہ پچھلے مضمون میں ، اعداد و شمار کو حاصل کرنے کا طریقہ اور شکل مندرجہ ذیل ہے ، 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))
ایک طویل انتظار کے بعد:
سب سے پہلے ٹریننگ کے اعداد و شمار کو دیکھیں ، عام طور پر ، پہلے نصف حصے میں ایک لمبا زوال اور دوسرے نصف حصے میں ایک مضبوط عروج ہے۔
ٹریننگ سے پہلے بہت ساری خریداری کی جاتی ہے ، بنیادی طور پر کوئی منافع بخش چکر نہیں ہوتا ہے۔ ٹریننگ کے وسط میں خریداری کی سرگرمیوں میں بتدریج کمی واقع ہوتی ہے ، منافع کا امکان بھی بڑھتا جارہا ہے ، لیکن اس کے باوجود نقصان کا امکان بہت زیادہ ہوتا ہے۔
اس کے علاوہ ، ہم نے ایک بار پھر اس کے بارے میں بات کی ہے:
اس حکمت عملی نے ابتدائی منفی منافع سے جلد ہی چھٹکارا حاصل کیا ، لیکن اتار چڑھاؤ بہت زیادہ تھا ، اور 10،000 چکر کے بعد تک منافع تیزی سے نہیں بڑھتا تھا ، اور عام طور پر ماڈل کی تربیت کرنا مشکل تھا۔
آخر میں، جب آپ نے ٹریننگ مکمل کرلی تو، ماڈل کو تمام اعداد و شمار کو ایک بار پھر چلایا جائے گا، اور اس وقت کے دوران اکاؤنٹ کی مجموعی مارکیٹ ویلیو، بکٹکو کی تعداد، بکٹکو کی قیمت کا تناسب، مجموعی آمدنی کو ریکارڈ کیا جائے گا.
اس کے علاوہ ، یہ بھی کہا گیا ہے کہ اس کے بعد سے ، اس کے بعد سے ، اس کے بعد سے ، اس کے بعد سے ، اس کے بعد سے ، اس کے بعد سے ، اس کے بعد سے ، اس کے بعد سے ، اس کے بعد سے.
مجموعی طور پر مارکیٹ کی قیمت میں ابتدائی عرصے کے دوران آہستہ آہستہ اضافہ ہوا اور بعد کے عرصے کے دوران بھی اضافہ ہوا ، لیکن پھر بھی مرحلہ وار نقصانات ہوئے۔
آخر میں ، ہولڈنگ تناسب کو دیکھیں ، گراف کا بائیں محور ہولڈنگ تناسب ہے ، دائیں محور مارکیٹ ہے ، ابتدائی طور پر یہ فیصلہ کیا جاسکتا ہے کہ ماڈل میں بہت زیادہ موافقت پیدا ہوگئی ہے ، ابتدائی عرصے میں ریچھ مارکیٹ کے دوران ہولڈنگ کی تعدد کم ہے ، اور مارکیٹ کے نچلے حصے میں ہولڈنگ کی تعدد بہت زیادہ ہے۔ یہ بھی دیکھا جاسکتا ہے کہ ماڈل نے طویل مدتی ہولڈنگ نہیں سیکھی ہے ، ہمیشہ تیزی سے فروخت ہوتی ہے۔
ٹیسٹ کے اعداد و شمار حاصل کرنے کے وقت سے لے کر 27 جون 2019 تک بٹ کوائن کی ایک گھنٹہ کی مارکیٹ۔ چارٹ میں دیکھا جاسکتا ہے کہ قیمت شروع میں 13،000 ڈالر سے گر کر آج 9،000 ڈالر سے زیادہ ہوگئی ہے ، جو ماڈل کے لئے ایک بہت بڑا امتحان ہے۔
اس کے علاوہ ، اس نے اپنے صارفین کو بتایا کہ اس نے اپنے صارفین کے لئے ایک نیا ورژن تیار کیا ہے۔
اگر آپ ہولڈنگ کی صورت حال کو دیکھیں تو یہ اندازہ لگایا جاسکتا ہے کہ ماڈل تیزی سے گرنے کے بعد خریدنے اور فروخت کرنے کا رجحان رکھتا ہے۔ حالیہ عرصے میں ، بٹ کوائن مارکیٹ میں بہت کم اتار چڑھاؤ رہا ہے ، اور ماڈل خالی ہولڈنگ کی حالت میں رہا ہے۔
اس مضمون میں ، پی پی او نے ایک بٹ کوائن خودکار ٹریڈنگ روبوٹ کو گہری تقویت یافتہ سیکھنے کے طریقہ کار کی مدد سے تربیت دی ، اور کچھ نتائج برآمد ہوئے۔ چونکہ وقت محدود ہے ، اس ماڈل میں بہتری کی کچھ جگہیں ہیں ، آپ سب کو اس پر بات کرنے کا خیرمقدم کرتے ہیں۔ اس میں سے سب سے بڑا سبق یہ ہے کہ اعداد و شمار کو معیاری بنانا ہے ، اسکیل اپ جیسے طریقوں کا استعمال نہ کریں ، ورنہ ماڈل تیزی سے قیمتوں اور مارکیٹوں کے تعلقات کو یاد رکھے گا ، اور فٹ بیٹھ جائے گا۔ شرح تبدیلی کی معیاری کاری کے بعد نسبتا 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 ((() ``