Zephyrnet Logosu

Amazon SageMaker RL kullanarak çok boyutlu eylem optimizasyonu yoluyla portföy optimizasyonu

Tarih:

Takviyeli öğrenme (RL), sıralı karar verme problemlerini çözmek için kullanılabilecek bir makine öğrenimi (ML) teknikleri sınıfını kapsar. RL teknikleri, finansal hizmetler, otonom navigasyon, endüstriyel kontrol ve e-ticaret dahil olmak üzere çok sayıda alanda yaygın uygulamalar bulmuştur. Bir RL probleminin amacı, ortamından bir gözlem verildiğinde, kümülatif ödülü en üst düzeye çıkaran en uygun eylemi seçecek bir etmen yetiştirmektir. RL ile bir iş problemini çözmek, aracının ortamını, eylem alanını, gözlem yapısını ve hedef iş sonucu için doğru ödül işlevini belirlemeyi içerir. Politika tabanlı RL yöntemlerinde, model eğitiminin sonucu genellikle, gözlem verilen eylemler üzerinde bir olasılık dağılımını tanımlayan bir politikadır. Optimal politika, temsilci tarafından elde edilen kümülatif getirileri maksimize edecektir.

Kısıtlı karar verme problemlerinde, aracı, kısıtlamalar altında en uygun eylemleri seçmekle görevlendirilir. Duruma bağlı olarak, aracının yalnızca tüm eylemlerin bir alt kümesinden seçim yapmasına izin verilebildiği bu tür sorunların farklı bir sınıfı mevcuttur. Kalan eylemler kabul edilemez.

Örneğin, 10 olası hız seviyesine sahip otonom bir araba düşünün. Bu arabanın, bir yerleşim bölgesinden geçerken yalnızca hız seviyelerinin bir alt kümesinden seçim yapmasına izin verilebilir. Burada hız seviyelerindeki kısıtlama, arabanın konumuna göre belirlenir. Eylemler üzerindeki bu tür parametreleştirilmiş kısıtlamalar, birçok gerçek dünya probleminde yaygındır. Bu tür sorunları RL ile çözmek, kısıtlamaların eğitim sürecine dahil edilmesini gerektirir. Eylem maskeleme kabul edilemezlik kısıtlamaları içeren RL problemlerini örnek verimli bir şekilde çözmek için bir yaklaşımdır. Adından da anlaşılacağı gibi, örnekleme olasılıklarını sıfıra ayarlayarak kabul edilemez eylemlerin maskelenmesini içerir. Aşağıdaki şekil, eylem maskelemeli RL döngüsünü göstermektedir. Bir aracıdan, eylem maskelerini belirleyen kısıtlamalardan, maskelerden, durum geçişlerinden ve gözlemlenen ödüllerden oluşur.

Bu yazıda, ile eylem maskelemenin nasıl uygulanacağını açıklıyoruz. Amazon SageMaker RL parametrik eylem alanlarını kullanarak ışın RLlib. Ayrık çok boyutlu eylem alanlarını ve çoklu kısıtlamaları içeren örnek bir problemi açıklıyoruz. Bu yazının not defterinin tamamına erişmek için bkz. SageMaker dizüstü bilgisayar örneği GitHub'da.

Kullanım örneğine genel bakış

Bir yatırımcının toplam portföy değerini maksimize etmek için birden çok varlık türünü alıp sattığı örnek bir portföy optimizasyon problemini ele alıyoruz. Portföy, üç farklı varlık türünden ve banka hesabınızdaki parayı ifade eden bir nakit bakiyesinden oluşur. Her yatırım dönemi boyunca, acentenin satın aldığı veya sattığı her bir varlık türünün miktarını seçmesi gerekir. Temsilci, herhangi bir varlık alımını finanse etmek için mevcut nakit bakiyesini kullanır. Her varlık alım/satım eylemiyle ilişkili işlem maliyetleri de vardır. Her varlığın piyasa fiyatının zaman içinde değiştiği varsayılır. Fiyatlar rastgele örneklenir, ancak farklı oynaklık seviyeleri ile farklı davranışlar gösterecek şekilde modellenir. Üç varlık sınıfı için fiyat aralıkları aşağıdaki şekilde gösterilmektedir.

Temsilci için kabul edilebilir eylemler seti, mevcut toplam portföy değeri, mevcut nakit bakiyesi, elde tutulan her bir varlık türünün sayısı ve bunların mevcut piyasa değeri gibi parametreler tarafından belirlenir. Bu sorun için, olası eylemler üzerinde aşağıdaki kısıtlamaları uyguluyoruz:

  • C1 – Aracı, şu anda sahip olduklarından daha fazla herhangi bir varlık türü birimi satamaz. Örneğin, temsilcinin portföyünde k zamanında 100 birim Varlık 3 varsa, o zaman o varlıktan 120 birim satamaz.
  • C2 – Varlık 3, yatırımcılar tarafından oldukça değişken olarak kabul edilir. Varlık 3'teki varlıklarının toplam değeri, toplam portföy değerinin üçte birinden fazlaysa, acentenin Varlık 3'ü satın almasına izin verilmez.
  • C3 – RL modelinin tüketicileri, orta derecede bir risk tercihine sahiptir ve Varlık 2'yi ihtiyatlı bir satın alma olarak kabul eder. Sonuç olarak, Varlık 2'nin toplam değeri toplam portföy değerinin üçte ikisini geçtiğinde aracının Varlık 2'yi satın almasına izin verilmez.
  • C4 – Temsilci, mevcut nakit bakiyesi 1 USD'den azsa herhangi bir varlık satın alamaz.

ortamı kurun

Başlamak için, aracılığıyla bir SageMaker not defteri örneği sağlayın Amazon SageMaker Stüdyosu. Daha fazla bilgi için bakınız Amazon SageMaker Notebook bulut sunucularını kullanın.

Ardından, portföy ticaret problemini özel bir şekilde uyguluyoruz. AI Gym'i açın ortam oluşturun ve SageMaker RL'yi kullanarak bir RL temsilcisini eğitin. Bir Spor Salonu ortamı, RL temsilcisinin ortamıyla etkileşim kurması ve ödüller ile gözlemler oluşturması için bir arabirim sağlar. Portföy ticareti ortamı, trading.py modül. biz kullanıyoruz __init__ bazı ortam parametrelerini tanımlama ve başlatma yöntemi. Bu, varlık alım/satım işlemleriyle ilişkili işlem maliyetlerini, varlık fiyatlarının ortalama değerini, fiyat sapmalarını ve daha fazlasını içerir. Gözlem ve eylem alanlarını da tanımlarız. __init__ yöntem. Aşağıdaki koda bakın:

def __init__(self,*args, **kwargs): self.buy_price=np.array([0.03, 0.045, 0.035]) # transaction cost per unit bought for three asset classes self.sell_price=np.array([0.025, 0.035, 0.03]) # transaction cost per unit sold for three asset classes self.mu=np.array([40,35,48]) # Mean initial asset price self.var=np.array([4,2,7]) # Variance of asset prices self.tvec=np.arange(20) # Length of each episode=20 self.sig=np.zeros((3,len(self.tvec))) self.sig[0,:]=self.mu[0]+0.4*self.tvec+4*np.cos(2*math.pi*self.tvec/16) #Functions used to model mean asset prices over time self.sig[1,:]=self.mu[1]+0.1*self.tvec self.sig[2,:]=self.mu[2]+0.3*self.tvec-6*np.sin(2*math.pi*self.tvec/7) state_bounds=state_bounds_gen() low,high= map(np.array,zip(*state_bounds.values())) # Minimum and maximum values for the state variables self.action_space = Tuple([Discrete(11),Discrete(11),Discrete(11)]) #Action space consisting of three discrete actions self.observation_space=Dict({"action_mask":Tuple([Box(0,1,shape=(11,)),Box(0,1,shape=(11,)),Box(0,1,shape=(11,))]), "trading_state":Box(low,high,dtype=np.float32)}) # Dictionary space consisting of trading state # and action mask

Temsilci herhangi bir zamanda üç varlık alıp sattığı için, aracı tarafından gerçekleştirilen eylemler üç boyutlu bir eylem vektörü kullanılarak temsil edilir. Eylem vektörünü oluşturan üç ayrı eylem, her bir varlık sınıfındaki işlemleri temsil eder ve her biri 11 olası değer alabilir. 11 ayrık değer, aşağıdaki şekilde gösterildiği gibi farklı satış, satın alma ve tutma eylemlerini kodlar. Örneğin, bir1=3, aracının 20 varlık türünden 1 birim satması anlamına gelir. Varlıklar 10'un katları halinde alınır ve satılır.

Gözlem uzayı iki elemanlı bir sözlük yapısına sahiptir. Bunlar, mevcut işlem durumunu ve mevcut işlem maskesi değerlerini temsil eder. Alım satım durumu, temsilci tarafından şu anda tutulan her bir varlığın miktarından, cari nakit bakiyesinden ve üç varlığın her birinin cari piyasa değerinden oluşan 7×1'lik bir vektördür. Eylem maskesi, her bir olası eyleme karşılık gelen maske değerlerine sahip 3×11'lik bir matristir. Ortam, her seferinde maske değerlerini hesaplar. update_mask() yöntem. C1:C4 kısıtlamalarından herhangi birini ihlal eden eylemlere sıfır maskesi atanır. Kabul edilebilir eylemler için mask değeri 1 olarak ayarlanmıştır. Aşağıdaki koda bakın:

def update_mask(self): self.action_mask=[np.array([1.0]*x.n) for x in self.action_space.spaces] # Set all masks to 1 if self.balance<1: # If balance < 1, set buy masks to zero (C4) for jj in range(len(self.action_mask)): self.action_mask[jj][6:]=[0.0]*5 self.action_mask[2][6:]=[0.0]*5 if (self.prices[2]*self.assets[2]/self.total_assets)>1.0/3.0 else [1.0]*5 #(C3) self.action_mask[1][6:]=[0.0]*5 if (self.prices[1]*self.assets[1]/self.total_assets)>2.0/3.0 else [1.0]*5 #(C2) for k in range(3): cap=int(min(5,self.assets[k]/10)) self.action_mask[k][:5]=[0.0]*(5-cap)+[1.0]*cap # (C1)

Her bölümün başında bir reset() ticaret durumunu, gözlemleri ve diğer parametreleri yeniden başlatmak için yöntem çağrılır. Temsilci, her eğitim bölümüne nakit bakiyesinde 1,000 USD ve sıfır varlıkla başlar. Her bölüm 20 yatırım döneminden oluşuyor.

 def reset(self): self.assets=np.zeros(3,dtype=np.float32) # Assets owned at the beginning self.balance=1000 # Initial cash balance self.t_step=0 self.prices=[np.random.normal(mu,var) for mu,var in zip(self.mu,self.var)] # Sampling market prices for the assets self.state=np.hstack([self.assets, self.balance, self.prices]) # Initial state self.total_assets=self.balance # Total portfolio value self.update_mask() # Updating action mask values reset_state={ "action_mask":list(np.float32(self.action_mask)), # Initial state "trading_state":np.float32(self.state) } return reset_state

Temsilci, her yatırım döneminin başında, kaydettiği en son gözlemlere dayalı olarak bir eylemi örnekler ve portföyünü günceller. Bu bir kullanılarak modellenmiştir step() yöntem. Portföy güncellendikten sonra durumu yeniden hesaplıyoruz. Eylem maskesi de çağrılarak güncellenir. update_mask() yöntemi.

def step(self, action): self.t_step+=1 for index, a in enumerate (action): print("action is ",a) print("price is ",self.prices[index]) quant=abs(a-5) # Number of assets traded/10 if a<5: # Condition: Asset sale ? if 10*quant*self.sell_price[index]>self.balance: # Condition: sale cost > Balance ? quant=np.floor(self.balance/(10*self.sell_price[index])) self.assets[index]-=10*quant # Asset update self.balance=self.balance+10*quant*(self.prices[index]-self.sell_price[index]) # Balance update if a>5: if 10*quant*(self.buy_price[index]+self.prices[index])>self.balance: # Condition: Buy cost > Balance ? quant=np.floor(self.balance/(10*(self.buy_price[index]+self.prices[index]))) self.assets[index]+=10*quant # Asset update self.balance=self.balance-10*quant*(self.prices[index]+self.sell_price[index]) # Balance update else: continue self.prices=np.array([np.random.normal(mu,var) for mu,var in zip(self.sig[:,self.t_step],self.var)]) # New asset prices self.state=np.hstack([self.assets,self.balance, self.prices]) # New state self.total_assets=self.balance+np.dot(self.assets,self.prices) # Total portfolio value self.update_mask() # Mask update obs={ "action_mask": list(np.float32(self.action_mask)), "trading_state":np.float32(self.state) } if self.t_step==len(self.tvec)-1: reward=self.total_assets # reward = Total portfolio value at the end of the episode else: reward=0 done=True if self.t_step==len(self.tvec)-1 else False return obs, reward, done, {}

Ödül fonksiyonu, nihai toplam portföy değeri olarak tanımlanır ve 20 yatırım döneminden sonra gerçekleşen her bölümün sonunda hesaplanır.

maskeleme modeli

Her zaman adımında ortam, sözlük durumunu döndürür ve ilkeyi temsil eden makine öğrenimi modeli, bu duruma dayalı bir eylem örneği verir. Bir parametrik eylem modeli, yalnızca maskelenmemiş (maske ≠ 0) eylemlerin örneklenmesini kolaylaştırır. Burada, eylem maskelemeyi etkinleştiren parametrik eylem modelini açıklıyoruz:

class ParametricActionsModel(TFModelV2): def __init__(self, obs_space, action_space, num_outputs, model_config, name, *args, **kwargs): super(ParametricActionsModel, self).__init__(obs_space, action_space, num_outputs, model_config, name, *args, **kwargs) self.true_obs_shape = (7,) self.action_embed_model = FullyConnectedNetwork(Box(np.finfo(np.float32).min,np.finfo(np.float32).max,shape=self.true_obs_shape), action_space, num_outputs, model_config, name, ) # action embedding model self.register_variables(self.action_embed_model.variables()) def forward(self, input_dict, state, seq_lens): action_mask= tf.cast(tf.concat(input_dict["obs"]["action_mask"], axis=1), tf.float32) # action mask values action_embedding,_ = self.action_embed_model({"obs":input_dict["obs"]["trading_state"]}) # action embeddings logit_mod = tf.maximum(tf.math.log(action_mask),tf.float32.min) # moidfiers to action logits return (action_embedding+logit_mod), state def value_function(self): return self.action_embed_model.value_function()

Eylemler, bir eylem gömme modeli tarafından verilen logitleri kullanan bir Softmax işlevi aracılığıyla model tarafından örneklenir. Bu model, __init__ yöntem. Maskeleme davranışının kendisi, forward() yöntem. Burada, işlem maskelerini ve ticaret durumunu çevreden alınan sözlük durumundan ayırıyoruz. İşlem yerleştirmeleri daha sonra ticaret durumunu eylem yerleştirme ağına geçirerek elde edilir. Ardından, her eylemin yerleştirme değerini ekleyerek değiştiririz. logit_mod logitlere. Dikkat edin logit_mod eylem maskesinin logaritmasının bir işlevidir. Mask = 1 olan eylemler için, mask'ın logaritması sıfır olur ve bu da onların yerleştirmelerini bozulmadan bırakır. Öte yandan, maske=0 olduğunda, maskenin logaritması → -∞. çünkü Softmax(x) →x olarak 0→ -∞, bu, maskelenmiş eylemlerin aracı tarafından örneklenmemesini sağlar.

Maskenin beklendiği gibi çalışıp çalışmadığını test edelim. Bir ışın eğitmeni nesnesi başlatıyoruz ve bazı eylemleri maskeliyoruz ve eğitmenin yalnızca maskesiz eylemleri örnekleyip örneklemediğine bakıyoruz:

import ray
import ray.rllib.agents.ppo as ppo
from ray.tune.registry import register_env
from trading import mytradingenv
from mask_model import register_actor_mask_model
import numpy as np register_actor_mask_model()
ray.shutdown()
ray.init(ignore_reinit_error=True) env_config={}
register_env("customtradingmodel", lambda env_config:mytradingenv(env_config)) TestEnvConfig = { "log_level":"WARN", "model": { "custom_model": "trading_mask" # Define the custom masking model in the config } } agent1 = ppo.PPOTrainer(config=TestEnvConfig,env="customtradingmodel")
env = agent1.env_creator('customtradingmodel')
state=env.reset()
print(state["action_mask"]) 

Aşağıdaki ekran görüntüsündeki çıktı, ilk eylem maskesi dizisini gösterir.

Şimdi maske vektörlerini değiştirelim, böylece1, eylem 8 hariç tüm seçenekler (30 adet Varlık 1 satın alın); için2 eylem 5 hariç her şey (Varlık 2'yi mevcut rakamlarda tutun); ve bir için3, 1. ve 2. işlemler (40 veya 30 adet Varlık 3 satmak) dışındaki her şey maskelenir:

state["action_mask"]=[np.zeros([11],dtype=np.float32) for _ in range(3)]
state['action_mask'][0][8]=1
state['action_mask'][1][5]=1
state['action_mask'][2][1:3]=[1,1]

Artık eylem maskesi dizisini değiştirdiğimize göre, yeni bir eylemi deneyip örnekleyeceğiz.

Aracı yalnızca maskesi kaldırılmış eylemleri örnekler. Bu, eylem maskelemenin beklendiği gibi çalıştığını doğrular.

Sonuçlar

Artık ortam ve parametrik eylem modeli tanımlandığına göre, SageMaker RL'yi kullanarak portföy optimizasyon problemini çözmek için bir aracı eğitiyoruz. C1:C4 kısıtlamaları altında ödülü en üst düzeye çıkarmak için en uygun politikayı öğrenmek üzere bir RL temsilcisini eğitiyoruz. RL aracısını 500,000 bölüm için eğitmek üzere SageMaker RL'deki yakın politika optimizasyonu (PPO) algoritmasını kullanıyoruz. Aşağıdaki eğitim yapılandırması, kullanılacak aracıyı nasıl belirlediğimizi gösterir. trading_mask bir şekilde custom_model kullanılacak olan:

 def get_experiment_config(self): return { "training": { "env": "mytradingmodel", "run": "PPO", # Use PPO algorithm "stop":{"episodes_total":500000}, # 500k training episodes "config": { "use_pytorch": False, "gamma": 0.99, "kl_coeff": 1.0, "num_sgd_iter": 20, "lr": 0.0001, "sgd_minibatch_size": 1000, "train_batch_size": 25000, "monitor": True, "model": { "custom_model": "trading_mask" # Use custom action masking model }, "num_workers": (self.num_cpus-1), "num_gpus": self.num_gpus, "batch_mode": "truncate_episodes", "explore":True, "exploration_config":{ "type":"StochasticSampling", }, }, "checkpoint_freq": 1, } }

Acente, ilk nakit bakiyesinde 1,000 USD ile başlar. Bölüm başına ortalama ödül, aşağıdaki tabloda gösterildiği gibi eğitim süresinin bir fonksiyonu olarak çizilir. Nihai toplam portföy değerini ödül olarak kullandığımızı hatırlayın. 20 yatırım dönemi sonunda acente portföyünün ortalama değerinin 3,000 USD'nin üzerinde olduğunu gözlemliyoruz.

Temizlemek

Bir SageMaker not defteri örneğinin kullanımının ötesinde herhangi bir altyapı sağlamadık. Studio aracılığıyla bir SageMaker not defteri örneği kullanıyorsanız, içindeki talimatları izleyerek onu kapatabilirsiniz. Açık Bir Not Defterini Kapatın.

Sonuç

Bu gönderide, RL modeli eğitiminde kısıtlamaları uygulamak için eylem maskelemeyi nasıl uygulayabileceğinizi tartıştık. Kabul edilemez eylemleri maskeleyerek, temsilcinin yalnızca geçerli eylemleri örneklemesini ve en uygun politikayı örnek verimli bir şekilde öğrenmesini sağlıyoruz. Temsilcinin, çoklu kısıtlamalar altında üç varlık türünün ticaretini yaparak portföy değerini en üst düzeye çıkarmakla görevlendirildiği bir portföy optimizasyon problemi sunduk. Ray RLlib kullanarak bu problem için çok boyutlu eylem maskelemenin nasıl uygulanacağını gösterdik. Kısıtlı portföy optimizasyon problemini SageMaker RL kullanarak çözmesi için bir RL aracısı eğittik.

Portföy optimizasyonunda SageMaker RL ve Ray RLlib kullanarak eylem maskelemeyi nasıl gerçekleştireceğinizi artık bildiğinize göre, bunu kabul edilemez eylemler içeren diğer RL problemlerinde deneyebilirsiniz. Bu gönderide geliştirilen eylem maskeleme kodunu, tek boyutlu eylem uzayını içeren daha basit problemler için de uyarlayabilirsiniz. Burada geliştirilen yaklaşımı RL kullanım durumlarınıza uygulamanızı ve herhangi bir sorunuz veya geri bildiriminiz varsa bize bildirmenizi öneririz.

Ek referanslar

Ek bilgi ve ilgili içerik için aşağıdaki kaynaklara bakın:


Yazarlar Hakkında

Dilşad Raihan Akkam Veettin AWS Profesyonel Hizmetlerinde çalışan bir Veri Bilimcisidir ve burada makine öğrenimi ve bulut bilgi işlem kullanarak iş zorluklarını çözmek için farklı sektörlerden müşterilerle iletişim kurar. Texas A&M Üniversitesi, College Station'dan Havacılık ve Uzay Mühendisliği alanında doktora derecesine sahiptir. Boş zamanlarında futbol izlemekten ve kitap okumaktan hoşlanır.

Paul Budnarain Amazon'un Envanter Tahmin Sistemleri (IFS) grubunda bir Uygulamalı Bilim Adamıdır ve Los Angeles, California merkezlidir.

spot_img

En Son İstihbarat

spot_img