লেনদেনের ক্ষেত্রে মেশিন লার্নিং প্রযুক্তির ব্যবহার

লেখক:ভাল, তৈরিঃ 2019-08-29 09:42:00, আপডেটঃ 2023-10-19 21:02:44

img

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

আপনি যদি আমার আগের নিবন্ধটি না পড়ে থাকেন তবে আমি আপনাকে আমার পূর্ববর্তী নিবন্ধটি পড়ার পরামর্শ দিচ্ছি স্বয়ংক্রিয় ডেটা গবেষণা পরিবেশ এবং ট্রেডিং কৌশল তৈরির সিস্টেমিক পদ্ধতির গাইড যা ইনভেন্টর কোয়ালিফাইং প্ল্যাটফর্মে নির্মিত।

এখানে তার ঠিকানাঃhttps://www.fmz.com/digest-topic/4187এবংhttps://www.fmz.com/digest-topic/4169 这两篇文章.

গবেষণার পরিবেশ তৈরির বিষয়ে

এই টিউটোরিয়ালটি সকল স্তরের দক্ষতা স্তরের অপেশাদার, প্রকৌশলী এবং ডেটা সায়েন্টিস্টদের জন্য ডিজাইন করা হয়েছে, আপনি ইন্ডাস্ট্রি বক্স বা প্রোগ্রামিং হুইল হোন না কেন, আপনার প্রয়োজনীয় একমাত্র দক্ষতা হ'ল পাইথন প্রোগ্রামিং ল্যাঙ্গুয়েজের একটি প্রাথমিক জ্ঞান এবং কমান্ড-লাইন অপারেশনগুলির যথেষ্ট জ্ঞান ((একটি ডেটা সায়েন্স প্রকল্প সেট আপ করার জন্য) ।

  • ইনভেন্টর কোয়ালিফাইড হোস্ট ইনস্টল করুন এবং Anaconda সেট আপ করুন

发明者量化平台FMZ.COM除了提供优质的各大主流交易所的数据源,还提供一套丰富的API接口以帮助我们在完成数据的分析后进行自动化交易。这套接口包括查询账户信息,查询各个主流交易所的高,开,低,收价格,成交量,各种常用技术分析指标等实用工具,特别是对于实际交易过程中连接各大主流交易所的公共API接口,提供了强大的技术支持。

উপরে উল্লিখিত সমস্ত বৈশিষ্ট্যগুলি একটি ডকার-এর মতো সিস্টেমে প্যাকেজ করা হয়েছে, যা আমরা করতে পারি তা হ'ল আমাদের ক্লাউড কম্পিউটিং পরিষেবাটি কেনা বা ভাড়া নেওয়া এবং ডকার সিস্টেমটি স্থাপন করা।

এই ডকার সিস্টেমটি ইনভেন্টর কোয়ালিফাইং প্ল্যাটফর্মের অফিসিয়াল নামের মধ্যে হোস্ট সিস্টেম নামে পরিচিত।

আমি আমার পূর্ববর্তী নিবন্ধে লিখেছি কিভাবে হোস্ট এবং বট স্থাপন করতে হয়ঃhttps://www.fmz.com/bbs-topic/4140

যারা তাদের নিজস্ব ক্লাউড সার্ভার স্থাপনার জন্য হোস্ট কিনতে চান তাদের জন্য এই নিবন্ধটি পড়ুনঃhttps://www.fmz.com/bbs-topic/2848

একটি ভাল ক্লাউড সার্ভিস এবং হোস্ট সিস্টেম সফলভাবে স্থাপন করার পরে, আমরা এখন পাইথনের বৃহত্তম টেম্পলেট ইনস্টল করতে যাচ্ছিঃ আনাকন্ডা।

এই প্রবন্ধে প্রয়োজনীয় সকল প্রাসঙ্গিক প্রোগ্রামিং পরিবেশ (অনির্ভরতা পুস্তিকা, সংস্করণ ব্যবস্থাপনা ইত্যাদি) বাস্তবায়নের জন্য সবচেয়ে সহজ উপায় হল Anaconda ব্যবহার করা। এটি একটি প্যাকেজড পাইথন ডেটা সায়েন্স ইকোসিস্টেম এবং একটি নির্ভরতা পুস্তিকা ম্যানেজার।

যেহেতু আমরা Anaconda কে ক্লাউড সার্ভিসে ইনস্টল করছি, তাই আমরা ক্লাউড সার্ভারে লিনাক্স সিস্টেমে Anaconda এর কমান্ড লাইন সংস্করণ ইনস্টল করার পরামর্শ দিই।

Anaconda ইনস্টল করার জন্য, Anaconda এর অফিসিয়াল গাইড দেখুনঃhttps://www.anaconda.com/distribution/

আপনি যদি একজন অভিজ্ঞ পাইথন প্রোগ্রামার হন এবং Anaconda ব্যবহার করার প্রয়োজন বোধ করেন না, তবে এটি সম্পূর্ণ ঠিক আছে। আমি অনুমান করব যে আপনি প্রয়োজনীয় নির্ভরতা পরিবেশ ইনস্টল করার জন্য সাহায্যের প্রয়োজন নেই, আপনি সরাসরি এই অংশটি এড়িয়ে যেতে পারেন।

লেনদেনের কৌশল

ট্রেডিং কৌশলটির চূড়ান্ত আউটপুট নিম্নলিখিত প্রশ্নগুলির উত্তর দিতে হবেঃ

  • দিকনির্দেশনাঃ সম্পদটি সস্তা, ব্যয়বহুল বা মূল্যবান কিনা তা নির্ধারণ করুন।

  • 开仓条件:如果资产价格便宜或者昂贵,你应该做多或者做空.

  • সমতল লেনদেনঃ যদি সম্পদের দাম যুক্তিসঙ্গত হয় এবং আমরা সেই সম্পদে একটি অবস্থান (পূর্ববর্তী ক্রয় বা বিক্রয়) ধরে রাখি তবে আপনি কি সমতল হওয়া উচিত?

  • দামের পরিসীমাঃ খোলা লেনদেনের জন্য মূল্য ((বা পরিসীমা)

  • পরিমাণঃ লেনদেনের পরিমাণ (যেমন ডিজিটাল মুদ্রার সংখ্যা বা পণ্যের ভবিষ্যতের হাতের সংখ্যা)

মেশিন লার্নিং উপরের প্রতিটি প্রশ্নের উত্তর দিতে ব্যবহার করা যেতে পারে, কিন্তু এই নিবন্ধের বাকি অংশের জন্য, আমরা প্রথম প্রশ্নের উত্তর, ট্রেডিং দিক উপর ফোকাস করা হবে।

কৌশলগত পদ্ধতি

কৌশল তৈরির জন্য, দুটি ধরণের পদ্ধতি রয়েছে, একটি মডেল ভিত্তিক; অন্যটি ডেটা ভিত্তিক খনন। এগুলি মূলত পরস্পরের বিপরীত পদ্ধতি।

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

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

স্পষ্টতই, মেশিন লার্নিং সহজেই ডেটা মাইনিং পদ্ধতিতে প্রয়োগ করা যায়। আসুন দেখি কিভাবে মেশিন লার্নিং ব্যবহার করে ডেটা মাইনিং দিয়ে ট্রেডিং সিগন্যাল তৈরি করা যায়।

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

pip install -U scikit-learn

মেশিন লার্নিং ব্যবহার করে ট্রেডিং কৌশল সংকেত তৈরি করা

  • ডেটা এক্সট্রাকশন

আমরা শুরু করার আগে, একটি স্ট্যান্ডার্ড মেশিন লার্নিং সমস্যা সিস্টেম নিচের চিত্রটি দেখায়ঃ

img

মেশিন লার্নিং সমস্যা সিস্টেম

আমরা যে বৈশিষ্ট্যটি তৈরি করতে যাচ্ছি তার কিছু পূর্বাভাস থাকতে হবে ((X), আমরা লক্ষ্য ভেরিয়েবল ((Y) পূর্বাভাস দিতে চাই এবং ঐতিহাসিক তথ্য ব্যবহার করে এমন একটি এমএল মডেল প্রশিক্ষণ দিতে চাই যা Y কে সম্ভাব্য প্রকৃত মানের সাথে যতটা সম্ভব কাছাকাছি পূর্বাভাস দিতে পারে। শেষ পর্যন্ত, আমরা এই মডেলটি ব্যবহার করে Y এর অজানা নতুন ডেটা সম্পর্কে পূর্বাভাস দিই। এটি আমাদের প্রথম ধাপে নিয়ে যায়ঃ

প্রথম ধাপঃ আপনার সমস্যাগুলি সেট করুন

  • আপনি কী পূর্বাভাস দিতে চান? কোনটি ভাল পূর্বাভাস? আপনি কীভাবে আপনার পূর্বাভাসের ফলাফল মূল্যায়ন করবেন?

সুতরাং, আমাদের উপরে যে ফ্রেমওয়ার্ক আছে, সেখানে Y কি?

img

আপনি কি ভবিষ্যদ্বাণী করতে চান?

আপনি কি ভবিষ্যতের দাম, ভবিষ্যতের রিটার্ন/পিএনএল, কিনুন/বিক্রয় সংকেত, পোর্টফোলিও বরাদ্দ অপ্টিমাইজ এবং ট্রেড কার্যকরভাবে সম্পাদন করার চেষ্টা করতে চান?

ধরুন আমরা পরবর্তী টাইমলাইনে মূল্য পূর্বাভাস দেওয়ার চেষ্টা করছি। এই ক্ষেত্রে, Y ((t) = price ((t + 1)); এখন আমরা ঐতিহাসিক তথ্য দিয়ে আমাদের কাঠামো সম্পন্ন করতে পারি।

মনে রাখবেন যে Y (t) শুধুমাত্র রিটার্নে জানা যায়, কিন্তু যখন আমরা আমাদের মডেল ব্যবহার করি তখন আমরা সময় t এর দাম জানি না ((t + 1) । আমরা আমাদের মডেল ব্যবহার করে Y (t) ভবিষ্যদ্বাণী করি এবং শুধুমাত্র সময় t + 1 এ এটিকে প্রকৃত মানের সাথে তুলনা করি। এর মানে হল যে আপনি Y কে ভবিষ্যদ্বাণী মডেলের বৈশিষ্ট্য হিসাবে ব্যবহার করতে পারবেন না।

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

img

এমএল ফ্রেমওয়ার্ক যা ভবিষ্যতের দামের পূর্বাভাস দেয়

উদাহরণস্বরূপ, আমরা একটি পূর্বাভাস মডেল তৈরি করব যা একটি অনুমিত বিনিয়োগের মূল্যায়নের ভবিষ্যতের প্রত্যাশিত বেঞ্চমার্ক (basis) মানের পূর্বাভাস দেবে, যেখানেঃ

basis = Price of Stock — Price of Future

basis(t)=S(t)−F(t)

Y(t) = future expected value of basis = Average(basis(t+1),basis(t+2),basis(t+3),basis(t+4),basis(t+5))

যেহেতু এটি একটি প্রত্যাবর্তন সমস্যা, তাই আমরা RMSE (পরিমিত রুট ত্রুটি) এ মডেলটি মূল্যায়ন করব। আমরা মোট Pnl কে মূল্যায়ন মান হিসাবে ব্যবহার করব।

দ্রষ্টব্যঃ RMSE সম্পর্কিত প্রাসঙ্গিক গাণিতিক জ্ঞানের জন্য অনুগ্রহ করে এনসাইক্লোপিডিয়া সম্পর্কিত বিষয়বস্তু দেখুন

  • 我们的目标:创建一个模型,使预测值尽可能接近Y.

দ্বিতীয় ধাপঃ নির্ভরযোগ্য তথ্য সংগ্রহ

আপনার সমস্যা সমাধানে সহায়তা করতে ডেটা সংগ্রহ এবং পরিষ্কার করুন

আপনি কোন ডেটা লক্ষ্য ভেরিয়েবল Y এর উপর ভবিষ্যদ্বাণী করতে সক্ষম তা বিবেচনা করতে হবে? যদি আমরা দামের পূর্বাভাস দিই, তাহলে আপনি বিনিয়োগের ট্যাগের দামের ডেটা, বিনিয়োগের ট্যাগের লেনদেনের পরিমাণের ডেটা, সংশ্লিষ্ট বিনিয়োগের ট্যাগের অনুরূপ ডেটা, বিনিয়োগের ট্যাগের সূচক ইক্যুইটি সামগ্রিক বাজার সূচক, অন্যান্য সংশ্লিষ্ট সম্পদের দাম ইত্যাদি ব্যবহার করতে পারেন।

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

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

এই নিবন্ধের জন্য, আমরা নিম্নলিখিত তথ্যগুলিকে একটি ভার্চুয়াল বিনিয়োগের সূচক হিসাবে ব্যবহার করেছি, এবং আমরা একটি খুব সুবিধাজনক পরিমাণগত সরঞ্জাম ব্যবহার করেছি, যা Auquan's Toolbox নামে পরিচিত। আরও তথ্যের জন্য, দেখুনঃhttps://github.com/Auquan/auquan-toolbox-python

# Load the data
from backtester.dataSource.quant_quest_data_source import QuantQuestDataSource
cachedFolderName = '/Users/chandinijain/Auquan/qq2solver-data/historicalData/'
dataSetId = 'trainingData1'
instrumentIds = ['MQK']
ds = QuantQuestDataSource(cachedFolderName=cachedFolderName,
                                    dataSetId=dataSetId,
                                    instrumentIds=instrumentIds)
def loadData(ds):
    data = None
    for key in ds.getBookDataByFeature().keys():
        if data is None:
            data = pd.DataFrame(np.nan, index = ds.getBookDataByFeature()[key].index, columns=[])
        data[key] = ds.getBookDataByFeature()[key]
    data['Stock Price'] =  ds.getBookDataByFeature()['stockTopBidPrice'] + ds.getBookDataByFeature()['stockTopAskPrice'] / 2.0
    data['Future Price'] = ds.getBookDataByFeature()['futureTopBidPrice'] + ds.getBookDataByFeature()['futureTopAskPrice'] / 2.0
    data['Y(Target)'] = ds.getBookDataByFeature()['basis'].shift(-5)
    del data['benchmark_score']
    del data['FairValue']
    return data
data = loadData(ds)

উপরের কোড দিয়ে, Auquan টুকরা টুলবক্স ডাউনলোড করেছে এবং ডেটা টুকরা অভিধানে আপলোড করেছে। আমরা এখন আমাদের পছন্দের ফরম্যাটে ডেটা প্রস্তুত করতে চাই। ফাংশন ds.getBookDataByFeature ()) ডেটা টুকরোটির অভিধানে ফিরে আসে, প্রতিটি বৈশিষ্ট্য একটি ডেটা টুকরো। আমরা সমস্ত বৈশিষ্ট্যযুক্ত স্টকগুলির জন্য নতুন ডেটা টুকরো তৈরি করি।

তৃতীয় ধাপঃ তথ্য বিভাজন

  • ডেটা থেকে প্রশিক্ষণ সেট তৈরি করুন, ক্রস-ভ্যালিডেশন করুন এবং সেগুলি পরীক্ষা করুন

এটি একটি অত্যন্ত গুরুত্বপূর্ণ পদক্ষেপ!আমরা এগিয়ে যাওয়ার আগে, আমরা আপনার মডেলকে প্রশিক্ষণের জন্য ডেটা সেটগুলিতে ডেটা বিভক্ত করা উচিত; পরীক্ষার ডেটাসেটগুলি মডেলের কার্যকারিতা মূল্যায়ন করার জন্য; এটি বিভক্ত করার পরামর্শ দেওয়া হয়ঃ 60-70% প্রশিক্ষণ সেট এবং 30-40% পরীক্ষার সেট।

img

ডেটাকে প্রশিক্ষণ সেট এবং পরীক্ষার সেট হিসাবে ভাগ করুন

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

img

ডাটাকে ট্রেনিং সেট, ভেরিফিকেশন সেট এবং টেস্টিং সেটে ভাগ করুন

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

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

মনে রাখবেন, একবার পরীক্ষার তথ্যের কার্যকারিতা পরীক্ষা করার পরে, মডেলটি আরও অনুকূল করার চেষ্টা করার জন্য পিছনে ফিরে যাবেন না। যদি আপনি দেখতে পান যে আপনার মডেলটি ভাল ফলাফল দেয় না তবে মডেলটি পুরোপুরি ফেলে দিন এবং আবার শুরু করুন। এটি পরামর্শ দেওয়া হয় যে এটি 60% প্রশিক্ষণ ডেটা, 20% যাচাইকরণ ডেটা এবং 20% পরীক্ষার ডেটা হতে পারে।

আমাদের সমস্যার জন্য, আমাদের কাছে তিনটি ডেটাসেট আছে, আমরা একটিকে প্রশিক্ষণ সেট হিসাবে ব্যবহার করব, দ্বিতীয়টি যাচাইকরণ সেট হিসাবে, এবং তৃতীয়টি আমাদের পরীক্ষার সেট হিসাবে।

# Training Data
dataSetId =  'trainingData1'
ds_training = QuantQuestDataSource(cachedFolderName=cachedFolderName,
                                    dataSetId=dataSetId,
                                    instrumentIds=instrumentIds)
training_data = loadData(ds_training)
# Validation Data
dataSetId =  'trainingData2'
ds_validation = QuantQuestDataSource(cachedFolderName=cachedFolderName,
                                    dataSetId=dataSetId,
                                    instrumentIds=instrumentIds)
validation_data = loadData(ds_validation)
# Test Data
dataSetId =  'trainingData3'
ds_test = QuantQuestDataSource(cachedFolderName=cachedFolderName,
                                    dataSetId=dataSetId,
                                    instrumentIds=instrumentIds)
out_of_sample_test_data = loadData(ds_test)

এর প্রত্যেকটির জন্য, আমরা লক্ষ্য ভেরিয়েবল Y যোগ করি, যা পরবর্তী পাঁচটি মৌলিক মানের গড় হিসাবে সংজ্ঞায়িত করা হয়।

def prepareData(data, period):
    data['Y(Target)'] = data['basis'].rolling(period).mean().shift(-period)
    if 'FairValue' in data.columns:
        del data['FairValue']
    data.dropna(inplace=True)
period = 5
prepareData(training_data, period)
prepareData(validation_data, period)
prepareData(out_of_sample_test_data, period)

চতুর্থ ধাপঃ বৈশিষ্ট্য নির্মাণ

ডেটা বিশ্লেষণের আচরণ এবং ভবিষ্যদ্বাণীযোগ্য বৈশিষ্ট্য তৈরি করুন

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

  • লক্ষ্য ভেরিয়েবলের সাথে সম্পর্কটি অন্বেষণ না করা পর্যন্ত একটি বড় বৈশিষ্ট্য নির্বাচন করবেন না।

  • লক্ষ্য ভেরিয়েবলগুলির সাথে খুব কম বা কোনও সম্পর্ক নেই যা অতিরিক্ত ফিটনেস হতে পারে

  • আপনি যে বৈশিষ্ট্যগুলি বেছে নিয়েছেন সেগুলি একে অপরের সাথে অত্যন্ত সম্পর্কিত হতে পারে, এবং এই ক্ষেত্রে, একটি সংখ্যক বৈশিষ্ট্যও লক্ষ্য ব্যাখ্যা করতে পারে

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

  • আপনি সর্বোচ্চ তথ্যের কফিয়েন্টর (MIC) অনুযায়ী, প্রধান উপাদান বিশ্লেষণ (PCA) এবং অন্যান্য পদ্ধতির মাধ্যমে প্রার্থী বৈশিষ্ট্যগুলিকে বাছাই করার চেষ্টা করতে পারেন

বৈশিষ্ট্য রূপান্তর / প্রথাগতকরণঃ

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

  • স্কেলিংঃ স্ট্যান্ডার্ড ডিফারেন্স বা চার ডিজিটের পরিসরে বৈশিষ্ট্যগুলি ভাগ করা

  • আবাসিকঃ বর্তমান থেকে ঐতিহাসিক গড় হ্রাস করুন

  • একীকরণঃ উপরের ((x - mean) / stdev এর দুটি রিট্রাকশন সময়কাল

  • রুটিন একীকরণঃ রিগ্রেশন সময়কালে (x-min) / (max-min) - থেকে +1 এর মধ্যে ডেটা স্ট্যান্ডার্ডাইজ করা এবং কেন্দ্র পুনরায় নির্ধারণ করা

মনে রাখবেন যেহেতু আমরা ঐতিহাসিক ধারাবাহিক গড়, স্ট্যান্ডার্ড ডিভিয়েশন, সর্বোচ্চ বা সর্বনিম্ন মান ব্যবহার করি যা রিট্রাকশনাল সময়ের চেয়ে বেশি, তাই বৈশিষ্ট্যটির একীকরণের মানসম্মত মানগুলি বিভিন্ন সময়ে বিভিন্ন বাস্তব মান প্রদর্শন করবে। উদাহরণস্বরূপ, যদি বৈশিষ্ট্যটির বর্তমান মান 5 হয়, তবে ধারাবাহিক 30 টি চক্রের গড় 4.5 হয়, এটি স্থির হওয়ার পরে এটি 0.5 তে রূপান্তরিত হয়। এর পরে, যদি ধারাবাহিক 30 টি চক্রের গড় মান 3 হয়, তবে 3.5 এর মান 0.5 হয়ে যায়। এটি মডেল ত্রুটির কারণ হতে পারে। অতএব, রক্ষণাবেক্ষণ করা কঠিন, আপনাকে আসলে কী মডেলের কার্যকারিতা উন্নত করেছে তা খুঁজে বের করতে হবে ((যদি থাকে) ।) ।

আমাদের সমস্যার প্রথমবারের জন্য, আমরা মিশ্রণ পরামিতি ব্যবহার করে একটি বিশাল সংখ্যক বৈশিষ্ট্য তৈরি করেছি। আমরা পরে দেখতে চাই যে আমরা বৈশিষ্ট্যগুলির সংখ্যা হ্রাস করতে পারি কিনা।

def difference(dataDf, period):
    return dataDf.sub(dataDf.shift(period), fill_value=0)
def ewm(dataDf, halflife):
    return dataDf.ewm(halflife=halflife, ignore_na=False,
                      min_periods=0, adjust=True).mean()
def rsi(data, period):
    data_upside = data.sub(data.shift(1), fill_value=0)
    data_downside = data_upside.copy()
    data_downside[data_upside > 0] = 0
    data_upside[data_upside < 0] = 0
    avg_upside = data_upside.rolling(period).mean()
    avg_downside = - data_downside.rolling(period).mean()
    rsi = 100 - (100 * avg_downside / (avg_downside + avg_upside))
    rsi[avg_downside == 0] = 100
    rsi[(avg_downside == 0) & (avg_upside == 0)] = 0
return rsi
def create_features(data):
    basis_X = pd.DataFrame(index = data.index, columns =  [])
    
    basis_X['mom3'] = difference(data['basis'],4)
    basis_X['mom5'] = difference(data['basis'],6)
    basis_X['mom10'] = difference(data['basis'],11)
    
    basis_X['rsi15'] = rsi(data['basis'],15)
    basis_X['rsi10'] = rsi(data['basis'],10)
    
    basis_X['emabasis3'] = ewm(data['basis'],3)
    basis_X['emabasis5'] = ewm(data['basis'],5)
    basis_X['emabasis7'] = ewm(data['basis'],7)
    basis_X['emabasis10'] = ewm(data['basis'],10)
    basis_X['basis'] = data['basis']
    basis_X['vwapbasis'] = data['stockVWAP']-data['futureVWAP']
    
    basis_X['swidth'] = data['stockTopAskPrice'] -
                        data['stockTopBidPrice']
    basis_X['fwidth'] = data['futureTopAskPrice'] -
                        data['futureTopBidPrice']
    
    basis_X['btopask'] = data['stockTopAskPrice'] -
                         data['futureTopAskPrice']
    basis_X['btopbid'] = data['stockTopBidPrice'] -
                         data['futureTopBidPrice']

    basis_X['totalaskvol'] = data['stockTotalAskVol'] -
                             data['futureTotalAskVol']
    basis_X['totalbidvol'] = data['stockTotalBidVol'] -
                             data['futureTotalBidVol']
    
    basis_X['emabasisdi7'] = basis_X['emabasis7'] -
                             basis_X['emabasis5'] + 
                             basis_X['emabasis3']
    
    basis_X = basis_X.fillna(0)
    
    basis_y = data['Y(Target)']
    basis_y.dropna(inplace=True)
    
    print("Any null data in y: %s, X: %s"
            %(basis_y.isnull().values.any(), 
             basis_X.isnull().values.any()))
    print("Length y: %s, X: %s"
            %(len(basis_y.index), len(basis_X.index)))
    
    return basis_X, basis_y
basis_X_train, basis_y_train = create_features(training_data)
basis_X_test, basis_y_test = create_features(validation_data)

পঞ্চম ধাপঃ মডেল নির্বাচন

নির্বাচিত প্রশ্নের উপর ভিত্তি করে উপযুক্ত পরিসংখ্যান / এমএল মডেল নির্বাচন করুন

মডেলের পছন্দটি সমস্যাটির গঠন পদ্ধতির উপর নির্ভর করে। আপনি কি মনিটরিং সমাধান করছেন (বৈশিষ্ট্য ম্যাট্রিক্সের প্রতিটি বিন্দু এক্সকে লক্ষ্য ভেরিয়েবল Y-এ ম্যাপ করা হয়) অথবা নন-মনিটরিং লার্নিং সমস্যা (কোনও ম্যাপ দেওয়া নেই, মডেল অজানা প্যাটার্ন শিখতে চেষ্টা করে)? আপনি কি রিগ্রেশন সমাধান করছেন (ভবিষ্যতে সময়ের প্রকৃত মূল্যের পূর্বাভাস) অথবা শ্রেণিবদ্ধকরণ সমস্যা (শুধুমাত্র ভবিষ্যতে সময়ের মূল্যের দিকনির্দেশের পূর্বাভাস) (বৃদ্ধি / হ্রাস)) ।

img

তত্ত্বাবধানে বা তত্ত্বাবধানে শেখার

img

প্রত্যাবর্তন or শ্রেণীবিভাগ

কিছু সাধারণ তত্ত্বাবধানে শেখার অ্যালগরিদম আপনাকে শুরু করতে সাহায্য করতে পারেঃ

  • লিনিয়ার রিগ্রেশন (প্যারামিটার, রিগ্রেশন)

  • লজিস্টিক রিগ্রেশন (প্যারামিটার, শ্রেণীবিভাগ)

  • কে-প্রতিবেশী (KNN) অ্যালগরিদম (উপায় ভিত্তিক, প্রত্যাবর্তন)

  • SVM,SVR ((প্যারামিটার, শ্রেণিবদ্ধকরণ এবং রিগ্রেশন)

  • সিদ্ধান্তের গাছ

  • সিদ্ধান্ত বন

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

ষষ্ঠ ধাপঃ প্রশিক্ষণ, যাচাইকরণ এবং অপ্টিমাইজেশন (ধাপ ৪-৬ পুনরাবৃত্তি করুন)

img

প্রশিক্ষণ এবং যাচাইকরণ ডেটাসেট ব্যবহার করে আপনার মডেলকে প্রশিক্ষণ এবং অপ্টিমাইজ করুন

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

আপনি যখন আপনার পছন্দের মডেলটি পেয়ে যাবেন, তখনই আপনি পরবর্তী ধাপে যেতে পারবেন।

আমাদের ডেমো সমস্যাটির জন্য, আসুন আমরা একটি সহজ লিনিয়ার রিগ্রেশন দিয়ে শুরু করি।

from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score
def linear_regression(basis_X_train, basis_y_train,
                      basis_X_test,basis_y_test):
    
    regr = linear_model.LinearRegression()
    # Train the model using the training sets
    regr.fit(basis_X_train, basis_y_train)
    # Make predictions using the testing set
    basis_y_pred = regr.predict(basis_X_test)
    # The coefficients
    print('Coefficients: \n', regr.coef_)
    
    # The mean squared error
    print("Mean squared error: %.2f"
          % mean_squared_error(basis_y_test, basis_y_pred))
    
    # Explained variance score: 1 is perfect prediction
    print('Variance score: %.2f' % r2_score(basis_y_test,
                                            basis_y_pred))
    # Plot outputs
    plt.scatter(basis_y_pred, basis_y_test,  color='black')
    plt.plot(basis_y_test, basis_y_test, color='blue', linewidth=3)
    plt.xlabel('Y(actual)')
    plt.ylabel('Y(Predicted)')
    plt.show()
    
    return regr, basis_y_pred
_, basis_y_pred = linear_regression(basis_X_train, basis_y_train, 
                                    basis_X_test,basis_y_test)

img

একীকরণ ছাড়া লিনিয়ার রিগ্রেশন

('Coefficients: \n', array([ -1.0929e+08, 4.1621e+07, 1.4755e+07, 5.6988e+06, -5.656e+01, -6.18e-04, -8.2541e-05,4.3606e-02, -3.0647e-02, 1.8826e+07, 8.3561e-02, 3.723e-03, -6.2637e-03, 1.8826e+07, 1.8826e+07, 6.4277e-02, 5.7254e-02, 3.3435e-03, 1.6376e-02, -7.3588e-03, -8.1531e-04, -3.9095e-02, 3.1418e-02, 3.3321e-03, -1.3262e-06, -1.3433e+07, 3.5821e+07, 2.6764e+07, -8.0394e+06, -2.2388e+06, -1.7096e+07]))
Mean squared error: 0.02
Variance score: 0.96

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

def normalize(basis_X, basis_y, period):
    basis_X_norm = (basis_X - basis_X.rolling(period).mean())/
                    basis_X.rolling(period).std()
    basis_X_norm.dropna(inplace=True)
    basis_y_norm = (basis_y - 
                    basis_X['basis'].rolling(period).mean())/
                    basis_X['basis'].rolling(period).std()
    basis_y_norm = basis_y_norm[basis_X_norm.index]
    
    return basis_X_norm, basis_y_norm
norm_period = 375
basis_X_norm_test, basis_y_norm_test = normalize(basis_X_test,basis_y_test, norm_period)
basis_X_norm_train, basis_y_norm_train = normalize(basis_X_train, basis_y_train, norm_period)
regr_norm, basis_y_pred = linear_regression(basis_X_norm_train, basis_y_norm_train, basis_X_norm_test, basis_y_norm_test)
basis_y_pred = basis_y_pred * basis_X_test['basis'].rolling(period).std()[basis_y_norm_test.index] + basis_X_test['basis'].rolling(period).mean()[basis_y_norm_test.index]

img

একীকরণের রৈখিক প্রত্যাবর্তন

Mean squared error: 0.05
Variance score: 0.90

এই মডেলটি আগের মডেলের চেয়ে উন্নত নয়, তবে খারাপও নয়। এখন আমরা আসলে কোনটি গুরুত্বপূর্ণ তা দেখতে কোয়ালিটি তুলনা করতে পারি।

আসুন আমরা কোয়ালিটি দেখি।

for i in range(len(basis_X_train.columns)):
    print('%.4f, %s'%(regr_norm.coef_[i], basis_X_train.columns[i]))

ফলাফলঃ

19.8727, emabasis4
-9.2015, emabasis5
8.8981, emabasis7
-5.5692, emabasis10
-0.0036, rsi15
-0.0146, rsi10
0.0196, mom10
-0.0035, mom5
-7.9138, basis
0.0062, swidth
0.0117, fwidth
2.0883, btopask
2.0311, btopbid
0.0974, bavgask
0.0611, bavgbid
0.0007, topaskvolratio
0.0113, topbidvolratio
-0.0220, totalaskvolratio
0.0231, totalbidvolratio

আমরা স্পষ্টভাবে দেখতে পাচ্ছি যে কিছু বৈশিষ্ট্য অন্য বৈশিষ্ট্যগুলির তুলনায় উচ্চতর কোয়ালিটি রয়েছে এবং সম্ভবত আরও শক্তিশালী ভবিষ্যদ্বাণী করতে পারে।

আসুন দেখি বিভিন্ন বৈশিষ্ট্যের মধ্যে কি সম্পর্ক রয়েছে।

import seaborn

c = basis_X_train.corr()
plt.figure(figsize=(10,10))
seaborn.heatmap(c, cmap='RdYlGn_r', mask = (np.abs(c) <= 0.8))
plt.show()

img

বৈশিষ্ট্যগুলির মধ্যে সম্পর্ক

গাঢ় লাল এলাকাটি অত্যন্ত প্রাসঙ্গিক ভেরিয়েবলগুলিকে নির্দেশ করে। আসুন আমরা আবার কিছু বৈশিষ্ট্য তৈরি/পরিবর্তন করি এবং আমাদের মডেলটি উন্নত করার চেষ্টা করি।

例如,我可以轻松地丢弃像emabasisdi7这样的特征,这些特征只是其他特征的线性组合.

def create_features_again(data):
    basis_X = pd.DataFrame(index = data.index, columns =  [])
    basis_X['mom10'] = difference(data['basis'],11)
    basis_X['emabasis2'] = ewm(data['basis'],2)
    basis_X['emabasis5'] = ewm(data['basis'],5)
    basis_X['emabasis10'] = ewm(data['basis'],10)
    basis_X['basis'] = data['basis']
    basis_X['totalaskvolratio'] = (data['stockTotalAskVol']
                                 - data['futureTotalAskVol'])/
                                   100000
    basis_X['totalbidvolratio'] = (data['stockTotalBidVol']
                                 - data['futureTotalBidVol'])/
                                   100000
    basis_X = basis_X.fillna(0)
    
    basis_y = data['Y(Target)']
    basis_y.dropna(inplace=True)
    return basis_X, basis_y
basis_X_test, basis_y_test = create_features_again(validation_data)
basis_X_train, basis_y_train = create_features_again(training_data)
_, basis_y_pred = linear_regression(basis_X_train, basis_y_train, basis_X_test,basis_y_test)
basis_y_regr = basis_y_pred.copy()

img

('Coefficients: ', array([ 0.03246139,
0.49780982, -0.22367172,  0.20275786,  0.50758852,
-0.21510795, 0.17153884]))
Mean squared error: 0.02
Variance score: 0.96

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

我们还可以尝试更复杂的模型,看看模型的变化是否可以提高性能.

  • কে এন এন (KNN) অ্যালগরিদম
from sklearn import neighbors
n_neighbors = 5
model = neighbors.KNeighborsRegressor(n_neighbors, weights='distance')
model.fit(basis_X_train, basis_y_train)
basis_y_pred = model.predict(basis_X_test)
basis_y_knn = basis_y_pred.copy()

img

  • এসভিআর
from sklearn.svm import SVR
model = SVR(kernel='rbf', C=1e3, gamma=0.1)
model.fit(basis_X_train, basis_y_train)
basis_y_pred = model.predict(basis_X_test)
basis_y_svr = basis_y_pred.copy()

img

  • সিদ্ধান্তের গাছ
model=ensemble.ExtraTreesRegressor()
model.fit(basis_X_train, basis_y_train)
basis_y_pred = model.predict(basis_X_test)
basis_y_trees = basis_y_pred.copy()

img

সপ্তম ধাপঃ পরীক্ষার তথ্য পুনরায় পরীক্ষা করুন

প্রকৃত নমুনা তথ্যের পারফরম্যান্স পরীক্ষা করুন

img

টেস্ট ডেটাসেটে পুনরায় পরীক্ষা করার কার্যকারিতা (এখনও স্পর্শ করা হয়নি)

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

এটি আপনাকে বাস্তবসম্মত প্রত্যাশা দেয় যে আপনি যখন রিয়েল-টাইম ট্রেডিং শুরু করবেন তখন আপনার মডেলটি নতুন এবং দেখা যায় না এমন ডেটাতে কীভাবে সম্পাদন করবে; অতএব, এটি নিশ্চিত করা প্রয়োজন যে আপনার কাছে একটি পরিষ্কার ডেটাসেট রয়েছে যা প্রশিক্ষণ বা যাচাইকরণের জন্য ব্যবহৃত হয় না।

আপনি যদি পরীক্ষার ডেটা পুনরায় পরীক্ষা করার ফলাফল পছন্দ না করেন তবে মডেলটি ফেলে দিন এবং আবার শুরু করুন। আপনার মডেলটি পুনরায় অপ্টিমাইজ করতে ফিরে যাবেন না, এটি অতিরিক্ত ফিটনেসের দিকে পরিচালিত করবে! (এছাড়াও একটি নতুন পরীক্ষার ডেটাসেট তৈরি করার পরামর্শ দেওয়া হচ্ছে, কারণ এই ডেটাসেটটি এখন দূষিত; মডেলটি ফেলে দেওয়ার সময় আমরা ইতিমধ্যে ডেটাসেটের বিষয়বস্তু সম্পর্কে অবগত ছিলাম) ।

এখানে আমরা Auquan এর টুলবক্স ব্যবহার করব।

import backtester
from backtester.features.feature import Feature
from backtester.trading_system import TradingSystem
from backtester.sample_scripts.fair_value_params import FairValueTradingParams
class Problem1Solver():
def getTrainingDataSet(self):
        return "trainingData1"
def getSymbolsToTrade(self):
        return ['MQK']
def getCustomFeatures(self):
        return {'my_custom_feature': MyCustomFeature}
def getFeatureConfigDicts(self):
                            
        expma5dic = {'featureKey': 'emabasis5',
                 'featureId': 'exponential_moving_average',
                 'params': {'period': 5,
                              'featureName': 'basis'}}
        expma10dic = {'featureKey': 'emabasis10',
                 'featureId': 'exponential_moving_average',
                 'params': {'period': 10,
                              'featureName': 'basis'}}                     
        expma2dic = {'featureKey': 'emabasis3',
                 'featureId': 'exponential_moving_average',
                 'params': {'period': 3,
                              'featureName': 'basis'}}
        mom10dic = {'featureKey': 'mom10',
                 'featureId': 'difference',
                 'params': {'period': 11,
                              'featureName': 'basis'}}
        
        return [expma5dic,expma2dic,expma10dic,mom10dic]    
    
    def getFairValue(self, updateNum, time, instrumentManager):
        # holder for all the instrument features
        lbInstF = instrumentManager.getlookbackInstrumentFeatures()
        mom10 = lbInstF.getFeatureDf('mom10').iloc[-1]
        emabasis2 = lbInstF.getFeatureDf('emabasis2').iloc[-1]
        emabasis5 = lbInstF.getFeatureDf('emabasis5').iloc[-1]
        emabasis10 = lbInstF.getFeatureDf('emabasis10').iloc[-1] 
        basis = lbInstF.getFeatureDf('basis').iloc[-1]
        totalaskvol = lbInstF.getFeatureDf('stockTotalAskVol').iloc[-1] - lbInstF.getFeatureDf('futureTotalAskVol').iloc[-1]
        totalbidvol = lbInstF.getFeatureDf('stockTotalBidVol').iloc[-1] - lbInstF.getFeatureDf('futureTotalBidVol').iloc[-1]
        
        coeff = [ 0.03249183, 0.49675487, -0.22289464, 0.2025182, 0.5080227, -0.21557005, 0.17128488]
        newdf['MQK'] = coeff[0] * mom10['MQK'] + coeff[1] * emabasis2['MQK'] +\
                      coeff[2] * emabasis5['MQK'] + coeff[3] * emabasis10['MQK'] +\
                      coeff[4] * basis['MQK'] + coeff[5] * totalaskvol['MQK']+\
                      coeff[6] * totalbidvol['MQK']
                    
        newdf.fillna(emabasis5,inplace=True)
        return newdf
problem1Solver = Problem1Solver()
tsParams = FairValueTradingParams(problem1Solver)
tradingSystem = TradingSystem(tsParams)
tradingSystem.startTrading(onlyAnalyze=False, 
                           shouldPlot=True,
                           makeInstrumentCsvs=False)

img

পুনরায় পরীক্ষার ফলাফল, Pnl ডলারে গণনা করা হয় (Pnl লেনদেনের খরচ এবং অন্যান্য খরচ অন্তর্ভুক্ত করে না)

অষ্টম ধাপঃ মডেল উন্নত করার অন্যান্য উপায়

স্লো অ্যাক্টিভেশন, গ্রুপ লার্নিং, ব্যাগিং এবং বুস্টিং

আরও ডেটা সংগ্রহ, আরও ভাল বৈশিষ্ট্য তৈরি বা আরও মডেল চেষ্টা করার পাশাপাশি, এখানে কিছু বিষয় রয়েছে যা আপনি উন্নত করার চেষ্টা করতে পারেন।

১. রোল-অফ যাচাইকরণ

img

রোল-অন যাচাইকরণ

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

এটি আরও ভাল হতে পারে যে আপনি জানুয়ারি থেকে ফেব্রুয়ারি পর্যন্ত প্রশিক্ষণ, মার্চ মাসে প্রশিক্ষণ, এপ্রিল থেকে মে মাসে পুনরায় প্রশিক্ষণ, জুন মাসে প্রশিক্ষণ ইত্যাদি চেষ্টা করুন।

২. সমষ্টিগত শিক্ষা

img

সমষ্টিগত শিক্ষা

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

img

প্যাকিং

img

উত্সাহ

আমি সংক্ষিপ্ত বিবরণ দেওয়ার জন্য এই পদ্ধতিগুলি এড়িয়ে যাব, তবে আপনি অনলাইনে আরও সম্পর্কিত তথ্য সন্ধান করতে পারেন।

আসুন আমরা আমাদের সমস্যার জন্য একটি সমষ্টিগত পদ্ধতি ব্যবহার করি।

basis_y_pred_ensemble = (basis_y_trees + basis_y_svr +
                         basis_y_knn + basis_y_regr)/4

img

Mean squared error: 0.02
Variance score: 0.95

এখন পর্যন্ত আমরা অনেক জ্ঞান এবং তথ্য সংগ্রহ করেছি। আসুন একটি দ্রুত পর্যালোচনা করিঃ

  • আপনার সমস্যার সমাধান করুন

  • নির্ভরযোগ্য তথ্য সংগ্রহ এবং পরিচ্ছন্নতা

  • ডেটাকে প্রশিক্ষণ, যাচাইকরণ এবং পরীক্ষার সেটগুলিতে বিভক্ত করুন

  • বৈশিষ্ট্য তৈরি এবং তাদের আচরণ বিশ্লেষণ

  • আচরণের ভিত্তিতে উপযুক্ত প্রশিক্ষণ মডেল নির্বাচন করুন

  • প্রশিক্ষণ ডেটা ব্যবহার করে আপনার মডেলকে প্রশিক্ষণ দিন এবং ভবিষ্যদ্বাণী করুন

  • যাচাইকরণ সেটগুলির পারফরম্যান্স পরীক্ষা করুন এবং পুনরায় অপ্টিমাইজ করুন

  • পরীক্ষামূলক সেটের চূড়ান্ত কার্যকারিতা যাচাই করুন

আপনি কি মনে করেন যে আমাদের কৌশলগুলির মধ্যে আমরা যা চাই তা আসলে কী? সুতরাং আপনার এখনও প্রয়োজন নেইঃ

  • ট্রেডিংয়ের দিকনির্দেশনা নির্ধারণের জন্য পূর্বাভাস মডেল ভিত্তিক সংকেত তৈরি করা

  • নির্দিষ্ট কৌশলগুলি বিকাশ করুন যা পলিসিগুলি সনাক্ত করে

  • পজিশন এবং মূল্য সনাক্ত করার জন্য বাস্তবায়ন সিস্টেম

এই সমস্ত তথ্যই উদ্ভাবকদের জন্য একটি পরিমাণগত প্ল্যাটফর্ম।FMZ.COMইনভেন্টর কোয়ালিটি প্ল্যাটফর্মে, একটি অত্যন্ত প্যাকেজযুক্ত এবং উন্নত এপিআই ইন্টারফেস রয়েছে, এবং বিশ্বব্যাপী কল করা যেতে পারে এমন ডাউনলোড এবং লেনদেনের ফাংশন রয়েছে, আপনাকে পৃথকভাবে প্যাকেজিং এবং বিভিন্ন এক্সচেঞ্জ যুক্ত করার জন্য একটি এপিআই ইন্টারফেস ছাড়াই। ইনভেন্টর কোয়ালিটি প্ল্যাটফর্মের কৌশল স্কোয়ারে, অনেকগুলি পরিপক্ক এবং সম্পূর্ণ বিকল্প কৌশল রয়েছে, যা এই নিবন্ধের মেশিন লার্নিং পদ্ধতির সাথে যুক্ত, যা আপনার নির্দিষ্ট কৌশলগুলিকে বাঘের মতো উইং করবে। কৌশল স্কোয়ারটি অবস্থিতঃhttps://www.fmz.com/square

লেনদেনের খরচ সম্পর্কে গুরুত্বপূর্ণ তথ্য:你的模型会告诉你所选资产何时是做多或做空。然而,它没有考虑费用/交易成本/可用交易量/止损等。交易成本通常会使有利可图的交易成为亏损。例如,预期价格上涨0.05美元的资产是买入,但如果你必须支付0.10美元进行此交易,你将最终获得净亏损$0.05。在你考虑经纪人佣金,交换费和点差后,我们上面看起来很棒的盈利图实际上是这样的:

img

লেনদেনের ফি এবং পয়েন্টের পরে পুনরায় পরিমাপের ফলাফল, Pnl ডলারে

আমাদের Pnl-এর ৯০% এরও বেশি অংশের জন্য লেনদেনের ফি এবং পার্থক্য রয়েছে! আমরা পরবর্তী নিবন্ধে বিস্তারিত আলোচনা করব।

শেষ পর্যন্ত, আসুন আমরা কিছু সাধারণ ফাঁদ দেখি।

কি করা উচিত এবং কি করা উচিত নয়

  • #এক্সপ্লোরার #অতিমাত্রা #সমন্বয় এড়াতে সবরকম চেষ্টা করুন।

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

  • বিচ্যুতি এড়ানো, বিশেষ করে ভবিষ্যদ্বাণীমূলক বিচ্যুতিঃ এটি মডেলটি কাজ না করার আরেকটি কারণ, নিশ্চিত করুন যে আপনি ভবিষ্যতের কোনও তথ্য ব্যবহার করেন নি। বেশিরভাগ ক্ষেত্রে, এর অর্থ হ'ল মডেলের বৈশিষ্ট্য হিসাবে লক্ষ্য ভেরিয়েবল Y ব্যবহার করবেন না। আপনি এটি ব্যাকগ্রাউন্ড পরীক্ষার সময় ব্যবহার করতে পারেন, তবে মডেলটি বাস্তবে চালানোর সময় এটি ব্যবহার করা যাবে না, যা আপনার মডেলকে অযোগ্য করে তুলবে।

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

অতিরিক্ত ফিটনেস এড়ানো

এটি খুবই গুরুত্বপূর্ণ, এবং আমি মনে করি এটি পুনরাবৃত্তি করা প্রয়োজন।

  • অতিরিক্ত ফিটনেস ট্রেডিং কৌশল সবচেয়ে বিপজ্জনক ফাঁদ

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

  • আপনার সিস্টেমকে যতটা সম্ভব সহজ করে তুলুন। যদি আপনি খুঁজে পান যে ডেটা ব্যাখ্যা করার জন্য আপনার প্রচুর জটিল বৈশিষ্ট্য প্রয়োজন, তাহলে আপনি সম্ভবত অতিরিক্ত ফিট হয়ে যাবেন।

  • আপনার উপলব্ধ ডেটাকে প্রশিক্ষণ এবং পরীক্ষার ডেটাতে বিভক্ত করুন এবং মডেলটি ব্যবহার করে রিয়েল-টাইম লেনদেনের আগে সর্বদা প্রকৃত নমুনা ডেটার কার্যকারিতা যাচাই করুন।


সম্পর্কিত

আরো

একপাশের পথধন্যবাদ বাবা।

congcong009নতুনদের জন্য চমৎকার নিবন্ধ, ধারণা এবং সারসংক্ষেপ।

লালাডেমাক্সিয়াগম্ভীর!