របាយការណ៍នេះបង្ហាញពីវិធីសាស្រ្តប្រលោមលោកចំពោះការជួញដូររូបិយប័ណ្ណគ្រីបតូដោយប្រើភ្នាក់ងារ Transformer-based Deep Reinforcement Learning (DRL) ។ ប្រព័ន្ធនេះប្រើប្រាស់ស្ថាបត្យកម្មដែលបំផុសគំនិតដោយ NLP ទំនើប (Transformers), Double DQN (DDQN), Noisy Networks, និង Low-Rank Adaptation (LoRA) សម្រាប់ការបណ្តុះបណ្តាល Test-Time (TTT)។ ដោយការរួមបញ្ចូលធាតុផ្សំទាំងនេះ ភ្នាក់ងារបង្ហាញពីការកែលម្អការសម្របខ្លួន ការបង្កើតគោលនយោបាយមានស្ថេរភាព និងបង្កើនប្រាក់ចំណេញយ៉ាងច្រើនលើទិន្នន័យ BTC/USDT ជាប្រវត្តិសាស្ត្រ។ ខណៈពេលដែលជាបឋម លទ្ធផលទាំងនេះបង្ហាញថាវិធីសាស្ត្រអាចត្រូវបានពង្រីកទៅសំណុំទិន្នន័យស្មុគស្មាញបន្ថែមទៀត (ឧ. លំដាប់សៀវភៅកម្រិត) និងថ្នាក់ទ្រព្យសកម្មជាច្រើន ដោយផ្តល់នូវមូលដ្ឋានគ្រឹះដែលអាចធ្វើមាត្រដ្ឋានបានសម្រាប់យុទ្ធសាស្ត្រពាណិជ្ជកម្មកម្រិតស្ថាប័ន។
កំណត់សម្គាល់របស់អ្នកនិពន្ធ៖ អត្ថបទនេះគឺសម្រាប់គោលបំណងផ្តល់ព័ត៌មានតែប៉ុណ្ណោះ ហើយមិនបង្កើតជាការណែនាំអំពីការវិនិយោគនោះទេ។ Cryptocurrencies គឺជាការប៉ាន់ស្មាន ស្មុគស្មាញ និងពាក់ព័ន្ធនឹងហានិភ័យខ្ពស់។ នេះអាចមានន័យថាការប្រែប្រួលតម្លៃខ្ពស់ និងការបាត់បង់សក្តានុពលនៃការវិនិយោគដំបូងរបស់អ្នក។ អ្នកគួរតែពិចារណាពីស្ថានភាពហិរញ្ញវត្ថុ គោលបំណងនៃការវិនិយោគរបស់អ្នក ហើយពិគ្រោះជាមួយអ្នកប្រឹក្សាហិរញ្ញវត្ថុមុននឹងធ្វើការសម្រេចចិត្តវិនិយោគណាមួយ។ ក្រុមវិចារណកថារបស់ HackerNoon បានត្រឹមតែផ្ទៀងផ្ទាត់សាច់រឿងសម្រាប់ភាពត្រឹមត្រូវនៃវេយ្យាករណ៍ប៉ុណ្ណោះ និងមិនគាំទ្រ ឬធានានូវភាពត្រឹមត្រូវ ភាពជឿជាក់ ឬភាពពេញលេញនៃព័ត៌មានដែលមានចែងក្នុងអត្ថបទនេះទេ។ #DYOR
ហេតុអ្វីបានជា Transformers ហេតុអ្វី DRL និងហេតុអ្វីបានជាអ្នកគួរយកចិត្តទុកដាក់
Transformers: កើតនៅក្នុងពិភព NLP ពួកគេពូកែក្នុងការឌិកូដលំដាប់។ ទីផ្សារគ្រាន់តែជាល្បែងផ្គុំរូបស៊េរីពេលវេលា។ Transformers អានរឿងទាំងនោះដូចជារឿង ប្រមើលមើលការកែប្រែផែនការ (ការផ្លាស់ប្តូរតម្លៃ) ឱ្យបានល្អ មុនពេលដែលបរិមាណមធ្យមរបស់អ្នកនឹងព្រិចភ្នែក។
DQN ទ្វេរដង (DDQN)៖ មិនមានការប៉ាន់ប្រមាណតម្លៃ Q-ម្ខាងទៀតទេ។ DDQN កាត់បន្ថយការប៉ាន់ប្រមាណដ៏គួរឱ្យភ្ញាក់ផ្អើលទាំងនោះ ដោយផ្តល់ឱ្យគោលនយោបាយពាណិជ្ជកម្មរបស់អ្នកនូវភាពជឿជាក់ដែលវាត្រូវការដើម្បីដោះស្រាយអន្ទាក់គោដ៏លំបាក និងការវាយឆ្មក់ខ្លាឃ្មុំ។
Noisy Nets លើកទឹកចិត្តឱ្យមានការរុករកដោយបន្ថែមសំឡេងរំខានដែលកំណត់ដោយផ្ទាល់ទៅទម្ងន់បណ្តាញ។
LoRA អនុញ្ញាតឱ្យការបណ្តុះបណ្តាលពេលវេលាសាកល្បង (TTT) ជាមួយនឹងការចំណាយលើការចំណាយតិចតួចបំផុត ដែលអាចឱ្យម៉ូដែលនេះអាចសម្របខ្លួនបានយ៉ាងឆាប់រហ័សទៅនឹងលក្ខខណ្ឌទីផ្សារថ្មីដោយគ្មានវដ្តនៃការបណ្តុះបណ្តាលពេញលេញ។
ការបណ្តុះបណ្តាលពេលវេលាសាកល្បង (TTT): ការផ្លាស់ប្តូរទីផ្សារ វិវឌ្ឍន៍ ការភ្ញាក់ផ្អើល។ TTT អនុញ្ញាតឱ្យម៉ូដែលនេះសម្របខ្លួនបានយ៉ាងរហ័ស ដោយកែសម្រួលយុទ្ធសាស្រ្តពាក់កណ្តាលជើងហោះហើរ ដូចជាវាកំពុងអានចំណងជើងនៅថ្ងៃស្អែកនៅថ្ងៃនេះ។
លេខកូដគឺនៅលើ
ក្នុងក្របខ័ណ្ឌនេះបង្កើតប្រព័ន្ធមួយដែលភ្នាក់ងារសិក្សាធ្វើអន្តរកម្មជាមួយបរិយាកាសពាណិជ្ជកម្មក្លែងធ្វើ ដែលដឹកនាំដោយស្ថាបត្យកម្មដែលមានមូលដ្ឋានលើ Transformer ទំនើប។ ជាស្នូលរបស់វា ប្រព័ន្ធស្វែងរកការកែលម្អការសម្រេចចិត្តលើការជួញដូរតាមពេលវេលា ដោយកែលម្អយុទ្ធសាស្រ្តរបស់ខ្លួនតាមរយៈការពង្រឹងការរៀនសូត្រ និងការសម្របខ្លួនយ៉ាងឆាប់រហ័សទៅនឹងលក្ខខណ្ឌទីផ្សារថ្មី។
ដំបូងពិចារណា គំរូ Transformer ។ ជាប្រពៃណី Transformers មានបដិវត្តវិស័យដូចជាការកែច្នៃភាសាធម្មជាតិដោយការបកស្រាយតាមលំដាប់នៃពាក្យ ឬសញ្ញាសម្ងាត់។ នៅទីនេះគោលការណ៍ដូចគ្នាត្រូវបានអនុវត្តចំពោះទិន្នន័យតម្លៃស៊េរីពេលវេលា។ ជំនួសឱ្យពាក្យ គំរូនេះប្រើប្រាស់លក្ខណៈទីផ្សារជាប្រវត្តិសាស្ត្រ — តម្លៃ បរិមាណ សូចនាករបច្ចេកទេស — និងការព្យាយាមទាញយកភាពអាស្រ័យបណ្តោះអាសន្នដ៏មានអត្ថន័យ។ ថ្នាក់ TransformerNetwork
ដែលកំណត់ក្នុងកូដ បង្ហាញឧទាហរណ៍អំពីវិធីសាស្រ្តនេះ។ សូមកត់សម្គាល់ពីរបៀបដែលអ្នកសាងសង់គ្រោងការបញ្ចូលធាតុដើមទៅក្នុងតំណាងវិមាត្រខ្ពស់ ហើយបន្ទាប់មកបញ្ជូនពួកវាតាមរយៈស្រទាប់បំលែងកូដ Transformer ជាច្រើន៖
class TransformerNetwork(nn.Module): def __init__(self, state_dim, output_dim, lookback, nhead=8, num_layers=4, model_dim=512, lora_r=8, lora_alpha=1.0, lora_active=False, sigma_init=hyperparameters['SIGMA_INIT']): super(TransformerNetwork, self).__init__() self.model_dim = model_dim self.lookback = lookback self.lora_active = lora_active self.input_fc = NoisyLoRALinear(state_dim, self.model_dim, r=lora_r, alpha=lora_alpha, lora_active=lora_active, sigma_init=sigma_init) encoder_layer = TransformerEncoderLayerRelative(d_model=model_dim, nhead=nhead, lora_r=lora_r, alpha=lora_alpha, lora_active=lora_active, sigma_init=sigma_init) self.transformer = TransformerEncoderRelative(encoder_layer, num_layers=num_layers) self.output_fc = NoisyLoRALinear(self.model_dim, output_dim, r=lora_r, alpha=lora_alpha, lora_active=lora_active, sigma_init=sigma_init) self._initialize_weights() def forward(self, x): x = self.input_fc(x) x = x.permute(1, 0, 2) x = self.transformer(x) x = x.mean(dim=0) output = self.output_fc(x) return output
អត្ថបទខ្លីៗនេះរំលេចលំហូរ៖ ស្ថានភាពឆៅចូលតាមរយៈ input_fc
(ស្រទាប់លីនេអ៊ែរដែលត្រូវបានពង្រឹងជាមួយនឹងសំលេងរំខាន និងការសម្របខ្លួនក្នុងចំណាត់ថ្នាក់ទាបដែលមានសក្តានុពល) ធ្វើដំណើរតាមរយៈម៉ូឌុល TransformerEncoderLayerRelative
ជង់គ្នាដែលចាប់យកព័ត៌មានទីតាំងបណ្តោះអាសន្ន និងទំនាក់ទំនង ហើយចុងក្រោយត្រូវបានសង្ខេបទៅជាសកម្មភាពដោយ output_fc
។ ការរចនានេះអនុញ្ញាតឱ្យគំរូដើម្បីថ្លឹងថ្លែងព្រឹត្តិការណ៍នៅចំណុចផ្សេងៗគ្នាតាមពេលវេលាកំណត់អត្តសញ្ញាណគំរូដែលកើតឡើងដដែលៗ ឬភាពមិនប្រក្រតីដែលអាចបង្ហាញពីឱកាសចំណេញ។
ប្រសិនបើម៉ូដែល Transformer ផ្តល់នូវ "ភ្នែក" និង "ត្រចៀក" របស់ភ្នាក់ងារ នោះ ថ្នាក់ TradingEnv ក្លែងធ្វើពិភពលោកដែលវាមានអន្តរកម្ម។ ថ្នាក់បរិស្ថាននេះ ដែលមានឈ្មោះថា TradingEnv
កំណត់អត្ថន័យនៃសកម្មភាព ដូចជាការបើក ឬបិទមុខតំណែង និងរបៀបផ្តល់រង្វាន់។ នៅក្នុងបរិយាកាស ភ្នាក់ងារសង្កេតមើលការផ្លាស់ប្តូរតម្លៃ សូចនាករបច្ចេកទេស និងការកាន់កាប់បច្ចុប្បន្នរបស់វា។ ការដកស្រង់ខាងក្រោមបង្ហាញពីរបៀបដែលបរិស្ថានបង្កើតរដ្ឋពីទិន្នន័យទីផ្សារ និងមុខតំណែងភ្នាក់ងារ៖
def get_state(self): states = [] current_timestamp = self.tech_array.iloc[self.time]['timestamp'] weight_long = float(self.stocks_long * self.current_price / self.total_asset) if self.total_asset > 0 else 0.0 weight_short = float(self.stocks_short * self.current_price / self.total_asset) if self.total_asset > 0 else 0.0 for _ in range(self.lookback): row = self.precomputed_tech.get(current_timestamp) if row is not None: features = row.drop(['timestamp', 'date']).astype(np.float32).values state_row = np.concatenate(([weight_long, weight_short], features)).astype(np.float32) else: state_row = np.zeros(self.state_dim, dtype=np.float32) states.append(state_row) current_timestamp -= self.get_timeframe_in_seconds() states = states[::-1] # ensure chronological order state = torch.tensor(np.array(states, dtype=np.float32), dtype=torch.float32).unsqueeze(0).to(self.device) return state
នៅទីនេះ បរិយាកាសបង្កើតបានជារដ្ឋដ៏សំបូរបែបដែលបង្កប់ដោយព័ត៌មានទីតាំង និងបង្អួចលក្ខណៈប្រវត្តិសាស្ត្រ។ តាមរយៈការផ្តល់នូវទស្សនវិស័យដែលមានបង្អួចនេះ Transformer អាចយកគំរូតាមគំរូបណ្តោះអាសន្ន។ ជំហាននីមួយៗនៅក្នុងបរិយាកាសធ្វើបច្ចុប្បន្នភាពមុខតំណែង គណនាប្រាក់ចំណេញ ឬការបាត់បង់ ហើយប្រគល់ស្ថានភាពថ្មី និងរង្វាន់សម្រាប់ភ្នាក់ងារ។ ការផ្លាស់ប្តូរវដ្តនេះជំរុញឱ្យមានរង្វិលជុំមតិត្រឡប់ ដោយអនុញ្ញាតឱ្យភ្នាក់ងារស្វែងយល់ពីអ្វីដែលដំណើរការ និងអ្វីដែលមិនដំណើរការ។
ម៉ាស៊ីនធ្វើការសម្រេចចិត្តស្ថិតនៅក្នុងថ្នាក់ DiscreteDDQNAgent ដែលអនុវត្តវិធីសាស្រ្ត Double DQN ។ Double DQN ជួយដោះស្រាយភាពលំអៀងនៃការប៉ាន់ប្រមាណលើសដែលល្បីនៅក្នុង Q-learning ដោយប្រើបណ្តាញដាច់ដោយឡែកសម្រាប់ការជ្រើសរើសសកម្មភាព និងការប៉ាន់ប្រមាណតម្លៃ។ ភ្នាក់ងាររក្សាករណី online_net
និង target_net
នៃគំរូដែលមានមូលដ្ឋានលើ Transformer ហើយប្រើសតិបណ្ដោះអាសន្នលេងឡើងវិញ ដើម្បីយកគំរូបទពិសោធន៍កន្លងមក។ ក្នុងអំឡុងពេលបណ្តុះបណ្តាល វាធ្វើបច្ចុប្បន្នភាពប៉ារ៉ាម៉ែត្ររបស់វាដោយកាត់បន្ថយភាពខុសគ្នារវាងតម្លៃ Q ដែលបានព្យាករណ៍ និងតម្លៃ Q គោលដៅដែលបានមកពីបណ្តាញគោលដៅ៖
def update(self): self.online_net.train() if len(self.memory) < self.batch_size: return None states, actions, rewards, next_states, dones = self.memory.sample(self.batch_size) q_values = self.online_net(states).gather(1, actions.unsqueeze(1)).squeeze(1) with torch.no_grad(): next_q_values = self.target_net(next_states).gather(1, self.online_net(next_states).argmax(dim=1).unsqueeze(1)).squeeze(1) target_q_values = rewards + self.gamma * next_q_values * (1 - dones) ddqn_loss = self.loss_fn(q_values, target_q_values.detach()) self.optimizer.zero_grad() ddqn_loss.backward() torch.nn.utils.clip_grad_norm_(self.online_net.parameters(), max_norm=1.0) self.optimizer.step() self.soft_update() return ddqn_loss.item()
កូដនេះបង្ហាញអំពីទម្លាប់នៃការបណ្តុះបណ្តាលយ៉ាងប្រុងប្រយ័ត្ន៖ ភ្នាក់ងារធ្វើគំរូម្តងហើយម្តងទៀតនូវបណ្តុំតូចៗនៃការផ្លាស់ប្តូរអតីតកាល គណនាការបាត់បង់ DDQN និងធ្វើបច្ចុប្បន្នភាព online_net
។ តាមកាលកំណត់ វាធ្វើបច្ចុប្បន្នភាពទន់នៃ target_net
ដើម្បីតាមដានការកែលម្អបន្តិចម្តងៗ។ តាមរយៈការរួមបញ្ចូលគ្នានូវសមត្ថភាពទទួលស្គាល់គំរូរបស់ Transformer ជាមួយនឹងសក្ដានុពលនៃការសិក្សាដែលមានស្ថេរភាពនៃ Double DQN ភ្នាក់ងារនោះកាន់តែមានភាពប៉ិនប្រសប់ក្នុងការជ្រើសរើសពាណិជ្ជកម្មដែលរកប្រាក់ចំណេញ។
ទោះជាយ៉ាងណាក៏ដោយស្ថានភាពទីផ្សារមិនដែលនៅស្ងៀមទេ។ ការផ្លាស់ប្តូរនៃភាពប្រែប្រួល ការផ្លាស់ប្តូរបទប្បញ្ញត្តិ ឬព្រឹត្តិការណ៍សាច់ប្រាក់ភ្លាមៗអាចប្រែក្លាយអ្នកឈ្នះកាលពីម្សិលមិញទៅជាអ្នកចាញ់នៅថ្ងៃនេះ។ ដើម្បីដោះស្រាយការផ្លាស់ប្តូរបែបនេះ គំនិតនៃ ការបណ្តុះបណ្តាលពេលវេលាសាកល្បង (TTT) ត្រូវបានណែនាំ។ ជាជាងការពឹងផ្អែកតែលើការអាប់ដេតដែលបានអនុវត្តបន្ទាប់ពីការប្រមូលនូវបទពិសោធន៍ជាច្រើន TTT អនុញ្ញាតឱ្យផ្នែកខ្លះនៃបណ្តាញសម្របខ្លួនយ៉ាងស្វាហាប់នៅពេលដែលរដ្ឋថ្មីមកដល់ សូម្បីតែក្នុងអំឡុងពេលការសន្និដ្ឋានក៏ដោយ។ ការសម្របខ្លួនយ៉ាងរហ័សនេះអនុញ្ញាតឱ្យភ្នាក់ងារកែតម្រូវឡើងវិញនូវយុទ្ធសាស្រ្តរបស់ខ្លួនភ្លាមៗ ដោយកែតម្រូវទៅតាមកាលៈទេសៈដែលមិនបានមើលឃើញទុកជាមុនដោយមិនចាំបាច់រង់ចាំវដ្តនៃការបណ្តុះបណ្តាលពេញលេញ។
នៅក្នុងកូដនេះ TTT ត្រូវបានសម្របសម្រួលដោយការជ្រើសរើសប៉ារ៉ាម៉ែត្របណ្ដុះបណ្ដាលក្នុងអំឡុងពេលការសន្និដ្ឋាន និងផ្តោតលើសំណុំរងតូចមួយនៃប៉ារ៉ាម៉ែត្រ។ ជាឧទាហរណ៍ ភ្នាក់ងារអាចកែប្រែផ្នែកមួយនៃបណ្តាញរបស់ខ្លួន ដើម្បីស្រូបយកគំរូថ្មីបានយ៉ាងឆាប់រហ័ស។ វិធីសាស្រ្ត activate_lora()
និង deactivate_lora()
(មិនត្រូវបានបង្ហាញឥឡូវនេះទេ ដោយសារយើងផ្តោតលើ Transformer, Env, DDQN និង TTT logic) បិទបើក និងបិទប៉ារ៉ាម៉ែត្រអាដាប់ធ័រទាំងនេះ។ ខណៈពេលដែលអត្ថបទកូដនោះសំដៅជាពិសេសទៅលើ LoRA (ការសម្របសម្រួលកម្រិតទាប) ទស្សនវិជ្ជាដូចគ្នាត្រូវបានអនុវត្ត៖ TTT មានន័យថាអនុញ្ញាតឱ្យផ្នែកខ្លះនៃគំរូដើម្បីរៀននៅពេលសាកល្បង។ នៅពេលមុខងារ TTT សកម្ម កម្មវិធីបង្កើនប្រសិទ្ធភាពពិសេសធ្វើបច្ចុប្បន្នភាពប៉ារ៉ាម៉ែត្រទាំងនេះនៅនឹងកន្លែង៖
def update_auxiliary(self, state): self.autoencoder.train() self.online_net.train() # Ensure noise and adaptive params are active masked_state, target_state = self.mask_input(state) masked_state_flat = masked_state.view(state.size(0), -1) target_state_flat = target_state.view(state.size(0), -1) reconstructed = self.autoencoder(masked_state_flat) aux_loss = F.mse_loss(reconstructed, target_state_flat) self.autoencoder_optimizer.zero_grad() self.ttt_optimizer.zero_grad() aux_loss.backward() torch.nn.utils.clip_grad_norm_(self.autoencoder.parameters(), max_norm=1.0) torch.nn.utils.clip_grad_norm_(filter(lambda p: p.requires_grad, self.online_net.parameters()), max_norm=1.0) self.autoencoder_optimizer.step() self.ttt_optimizer.step() self.autoencoder.eval() return aux_loss.item()
ទម្លាប់នៃការអាប់ដេតជំនួយនេះ ដែលបង្កឡើងនៅពេលសាកល្បង បង្ហាញពីការសម្របខ្លួនរបស់ប្រព័ន្ធ។ ភ្នាក់ងារលាក់បាំងលក្ខណៈពិសេសបញ្ចូលមួយចំនួនដោយចេតនា ហើយព្យាយាមបង្កើតពួកវាឡើងវិញ ដោយធ្វើអោយប្រសើរឡើងនូវតំណាងផ្ទៃក្នុងរបស់វានៃរបបទីផ្សារបច្ចុប្បន្ន។ តាមរយៈការធ្វើដូច្នេះ វាអាចមានប្រតិកម្មយ៉ាងឆាប់រហ័សចំពោះការផ្លាស់ប្តូរទិន្នន័យ និងរក្សាបាននូវយុទ្ធសាស្រ្តដែលរកប្រាក់ចំណេញនៅក្នុងទិដ្ឋភាពផ្លាស់ប្តូរដែលមិនធ្លាប់មាន។
សរុបមក អន្តរកម្មរវាងសមាសធាតុទាំងនេះបង្កើតបានជាម៉ាស៊ីនជួញដូរដ៏រឹងមាំ និងអាចបត់បែនបាន។ ម៉ូដែលដែលមានមូលដ្ឋានលើ Transformer ផ្តល់នូវការយល់ដឹងដ៏សំបូរបែប បរិបទនៃសញ្ញាទីផ្សារ។ TradingEnv ក្លែងធ្វើលក្ខខណ្ឌជាក់ស្តែង និងរង្វិលជុំមតិត្រឡប់។ ក្របខណ្ឌ DQN ទ្វេធានានូវការរៀនសូត្រប្រកបដោយស្ថិរភាពនៃតម្លៃសកម្មភាព ដោយកែលម្អបន្តិចម្តងៗនូវការសម្រេចចិត្តពាណិជ្ជកម្ម។ ទីបំផុត TTT អនុញ្ញាតឱ្យភ្នាក់ងាររក្សាភាពរហ័សរហួន ដោយកែតម្រូវប៉ារ៉ាម៉ែត្រខាងក្នុងរបស់វា នៅពេលប្រឈមមុខនឹងគំរូប្រលោមលោក។ រួមគ្នា ធាតុទាំងនេះកំណត់ដំណាក់កាលសម្រាប់ប្រព័ន្ធដែលមានភាពទំនើបក្នុងការទទួលស្គាល់គំរូ និងមានភាពធន់នឹងការប្រឈមមុខនឹងភាពមិនច្បាស់លាស់នៃទីផ្សារ ដោយផ្តល់នូវចក្ខុវិស័យដ៏គួរឱ្យទាក់ទាញសម្រាប់យុទ្ធសាស្រ្តជួញដូរជំនាន់ក្រោយ។
តើលទ្ធផលជាអ្វី?
សក្តានុពលកម្រិតបន្ទាប់
បញ្ចេញមតិ ចូលរួម ផ្តល់ជូនកិច្ចព្រមព្រៀង 🤯
សូមកុំឱ្យវាក្លាយជាការចង់ដឹងចង់ឃើញភ្លាមៗ។ យោបល់, រិះគន់, សួរសំណួរ។ ប្រសិនបើអ្នកឆ្ងល់ពីរបៀបបង្វែរយុទ្ធសាស្រ្តរបស់អ្នក ឬរបៀបបញ្ចូលដំណោះស្រាយ DRL ដែលអាចបត់បែនបានទៅក្នុងជង់ដែលមានស្រាប់របស់អ្នក សូមបញ្ចេញមតិយោបល់។