Type/to search
2
Follow
496
Followers
আর্থিক তথ্য প্রক্রিয়াকরণের তিনটি অপরিহার্য কৌশল উন্মোচন: ওয়েভলেট ট্রান্সফর্ম আসলে কী?
Discussions
Created 2025-12-25 14:35:55  Updated 2026-01-09 11:16:40
 0
 533

img

📢 স্তরযুক্ত বর্ম

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


I. ভূমিকা: "ঝিহু গুরু" (বিশেষজ্ঞ) কে অস্বীকার করা

যারা ঝিহুতে প্রায়শই আর্থিক এবং পরিমাণগত বিষয়গুলি ব্রাউজ করেন তারা অবশ্যই এই দৃশ্যটি দেখেছেন:

কিছু "বিশেষজ্ঞ" বারবার বলছেন:

  • তরঙ্গ রূপান্তর শব্দ হ্রাস
  • ফুরিয়ার রূপান্তর নিষ্কাশন সময়কাল
  • ল্যাপ্লেস স্মুথিং বহিরাগত অংশগুলি সরিয়ে দেয়।

সে সবাইকে হতবাক করে দিল, যেন সে পরিমাণগত বাণিজ্যের মতো পারমাণবিক অস্ত্র আয়ত্ত করে ফেলেছে।

কিন্তু তুমি কি চাও যে সে তোমাকে কোডটি দেখাক?
"এটা... একটা ট্রেড সিক্রেট, আর আমি এটা প্রকাশ করতে পারব না।"

তাকে নীতিটি ব্যাখ্যা করতে বলুন।
"এটা... উন্নত গণিতের ব্যাপার, আমি তোমাকে ব্যাখ্যা করলেও তুমি বুঝতে পারবে না।"

আজ, আমরা এই "ঝিহু বিশেষজ্ঞদের দ্বারা প্রায়শই উল্লেখিত বিষয়গুলি অন্বেষণ করব, আর্থিক বাজারে তরঙ্গ রূপান্তরের ব্যবহারিক প্রয়োগগুলি পরিচয় করিয়ে দেব এবং এই প্রযুক্তি সম্পর্কে সঠিক ধারণা বিকাশে সকলকে সহায়তা করব।


II. তরঙ্গ রূপান্তর আসলে কী?

সরল ব্যাখ্যা

কল্পনা করুন আপনি একটি গান শুনছেন, কিন্তু রেকর্ডিংয়ে ব্যাকগ্রাউন্ড নয়েজ আছে:

মূল রেকর্ডিং = মানুষের কণ্ঠস্বর + পটভূমির শব্দ + স্থির

তরঙ্গ রূপান্তর হল একটিস্মার্ট ফিল্টার

  • কণ্ঠস্বর সংরক্ষণ করুন
  • শব্দ ফিল্টার করুন
  • এটি আপনাকে এও বলতে পারে যে কোন অংশটি কোরাস এবং কোন অংশটি পদ্য।

আর্থিক বাজারে স্যুইচ করুন:

আসল দাম = প্রকৃত প্রবণতা + স্বল্পমেয়াদী ওঠানামা + এলোমেলো শব্দ

ওয়েভলেট ট্রান্সফর্ম আপনাকে সাহায্য করতে পারে:

  • প্রকৃত প্রবণতা বের করা(দীর্ঘমেয়াদী দিকনির্দেশনা)
  • স্বল্পমেয়াদী ওঠানামা ফিল্টার করা(আন্তঃদিনের ওঠানামা)
  • মূল পরিবর্তন বিন্দু চিহ্নিত করা(ট্রেন্ড রিভার্সাল)

মূল ধারণা: ভিত্তি ফাংশনের পচন

তরঙ্গ রূপান্তরের সারমর্ম হল**"বেসিস ফাংশন" (তরঙ্গ) এর একটি নির্দিষ্ট সেট ব্যবহার করে মূল সংকেতটি পচন করুন।**。

কল্পনা করুন আপনি একজন ব্যক্তির চেহারা বর্ণনা করতে চান:

  • ঐতিহ্যবাহী পদ্ধতি: পিক্সেল অনুসারে পিক্সেল বর্ণনা করা, যা খুবই ক্লান্তিকর।
  • তরঙ্গায়িত পদ্ধতি: "চোখের আকার, নাকের উচ্চতা এবং মুখের আকৃতি" এর মতো বিষয়গুলি ব্যবহার করেবৈশিষ্ট্যবর্ণনা একত্রিত করতে

আর্থিক মূল্যের ক্ষেত্রে:

মূল মূল্য সিরিজ = বেসিস ফাংশন ১ × ওজন ১ + বেসিস ফাংশন ২ × ওজন ২ + ... + শব্দ

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

ফিল্টার: ফ্রিকোয়েন্সি ডোমেইনে একটি চালনী

তরঙ্গ রূপান্তর মূলত একটি...মাল্টিস্কেল ফিল্টার ব্যাংক:

উচ্চ-ফ্রিকোয়েন্সি ফিল্টার → দ্রুত ওঠানামা (দৈনিক শব্দ, টিক-স্তরের ওঠানামা) ক্যাপচার করে
মধ্যবর্তী ফ্রিকোয়েন্সি ফিল্টার → মাঝারি-মেয়াদী প্রবণতা (কয়েক ঘন্টা থেকে কয়েক দিনের ব্যান্ড) ক্যাপচার করে।
কম-ফ্রিকোয়েন্সি ফিল্টার → দীর্ঘমেয়াদী প্রবণতা (সাপ্তাহিক এবং মাসিক প্রবণতা) ক্যাপচার করুন।

কেন একে "তরঙ্গ" বলা হয়?

  • ঐতিহ্যবাহী ফুরিয়ার ট্রান্সফর্ম ব্যবহারঅসীম দীর্ঘ সাইন তরঙ্গঅসীম দীর্ঘ শাসকের মতো
  • তরঙ্গ রূপান্তর ব্যবহৃত হয়সসীম-দৈর্ঘ্যের "ছোট" তরঙ্গবিভিন্ন দৈর্ঘ্যের রুলারের সেটের মতো

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

তরঙ্গের সুবিধা:স্থানীয়করণ বিশ্লেষণএটি আপনাকে বলতে পারে "২০ ডিসেম্বর, ২০২৫ তারিখে বিকাল ৩টা থেকে ৫টার মধ্যে দামের প্রবণতা মূলত ঊর্ধ্বমুখী ছিল", "সামগ্রিক বাজার ওঠানামা করছিল" এর মতো কোনও সাধারণ উপসংহারের পরিবর্তে।

পুনর্গঠন: পচন থেকে পুনর্গঠন পর্যন্ত

তরঙ্গ রূপান্তর হলবিপরীতমুখীএটা খুবই গুরুত্বপূর্ণ!

আসল দাম ---> তরঙ্গের পচন ---> ট্রেন্ড কম্পোনেন্ট + অস্থিরতা কম্পোনেন্ট + নয়েজ কম্পোনেন্ট
ট্রেন্ড কম্পোনেন্ট + ভোলাটিলিটি কম্পোনেন্ট + নয়েজ কম্পোনেন্ট ---> ওয়েভলেট পুনর্গঠন ---> আসল দাম

রিফ্যাক্টরিং প্রক্রিয়াএটি বিভিন্ন উপাদানের পচন ঘটানোর জন্য।বেছে বেছে ফিরে একত্রিত করুন

  • ট্রেন্ড কম্পোনেন্ট =[৯৯৮০০, ৯৯৮৫০, ৯৯৯০০, ৯৯৯৫০, ...] # আমরা যা চাই
  • ওঠানামা উপাদান =[+২০০, -১৫০, +১৮০, -১২০, ...] # কাজে লাগতে পারে
  • শব্দের উপাদান =[±১০, ±১৫, ±৮, ±১২, ...] # বাদ দিন!

পুনর্গঠনের সময় শুধুমাত্র ট্রেন্ড উপাদান ব্যবহার করুন

পচনের পর, নিম্নলিখিতটি পাওয়া গেল

  • পুনর্নির্মিত মূল্য = ট্রেন্ড কম্পোনেন্ট + আংশিক অস্থিরতা কম্পোনেন্ট

প্রকৃত লেনদেনে, আমরা সাধারণতশুধুমাত্র কম-ফ্রিকোয়েন্সি অংশটি পুনর্নির্মাণ করুন(ট্রেন্ড) উচ্চ-ফ্রিকোয়েন্সি উপাদানগুলি (শব্দ) সরাসরি বাতিল করা হয়। এটি তরঙ্গ "শব্দ হ্রাস" এর নীতি।

গণিতের নীতিমালা (সরলীকৃত সংস্করণ)

জটিল ইন্টিগ্রাল সূত্রগুলি এড়িয়ে চলুন এবং সাধারণ মানুষের ভাষায় ব্যাখ্যা করুন:

তরঙ্গ রূপান্তর = "তরঙ্গ সহগ" এর একটি সেট ব্যবহার করে মূল্য সিরিজের ওজনযুক্ত গড়

মৌলিক সূত্র:

দাম কমানো[i] = Σ(মূল মূল্য)[i-j] × তরঙ্গ সহগ[j]) / Σ(ওয়েভলেট সহগ)[j])

ফিল্টার দৃষ্টিকোণ

মূল মূল্য একটি তরঙ্গ ফিল্টারের মাধ্যমে ফিল্টার করা হয় → বিভিন্ন ফ্রিকোয়েন্সির উপাদানগুলি "নির্বাচিত" করা হয়।

চাবিকাঠি হলতরঙ্গ সহগ নির্বাচন

  • বিভিন্ন তরঙ্গ = বিভিন্ন ফিল্টার বৈশিষ্ট্য = বিভিন্ন ফ্রিকোয়েন্সি প্রতিক্রিয়া
  • বিভিন্ন স্তর = বিভিন্ন সময় স্কেল = বিভিন্ন ট্রেন্ড চক্র

উদাহরণস্বরূপ

ধরে নিচ্ছি আপনি Daubechies 4 তরঙ্গ ব্যবহার করছেন, সহগগুলি হল[0.483, 0.837, 0.224, -0.129]:

এই সহগের সেটটি একটি ফিল্টারকে সংজ্ঞায়িত করে:

  • ধনাত্মক সহগ (0.483, 0.837, 0.224) → এই অবস্থানগুলির জন্য মূল্য ধরে রাখুন।
  • ঋণাত্মক সহগ (-0.129) → পূর্ববর্তী মূল্যের ওঠানামা দমন করে
  • সহগ ওজন → প্রতিটি মূল্যের অবদান নির্ধারণ করে।

যখন আপনি এই ফিল্টারটি পুরো মূল্য সিরিজ জুড়ে "স্লাইড" করেন তখন তরঙ্গ রূপান্তর সম্পন্ন হয়। প্রতিটি স্লাইডে গণনা জড়িত থাকে।বর্তমান সময়সীমার মধ্যে মূল্যের গড় ওজনওজন হলো তরঙ্গ সহগ।

কেন এটি সংকেতগুলিকে "পচন" করতে পারে?

কারণ এটি গাণিতিকভাবে প্রমাণিত হতে পারে:**যেকোনো সংকেতকে তরঙ্গদৈর্ঘ্যের ভিত্তি ফাংশনের একটি রৈখিক সমন্বয় হিসেবে উপস্থাপন করা যেতে পারে।**ঠিক যেমন RGB-এর তিনটি প্রাথমিক রঙ মিশিয়ে যেকোনো রঙ তৈরি করা যায়, তেমনি তরঙ্গমূল্যের ফাংশন একত্রিত করে যেকোনো মূল্য সিরিজ তৈরি করা যেতে পারে। বিভিন্ন তরঙ্গমূল্য বিভিন্ন ধরণের সংকেত বিশ্লেষণের জন্য উপযুক্ত বিভিন্ন "বেসিস ফাংশন লাইব্রেরি" প্রদান করে।


III. এই প্রচেষ্টা: ৭টি তরঙ্গ রূপান্তরের ব্যবহারিক প্রয়োগ

প্রয়োগ পদ্ধতি: তত্ত্ব থেকে অনুশীলনে সরলীকরণ

সিগন্যাল প্রক্রিয়াকরণ পাঠ্যপুস্তকে, তরঙ্গ রূপান্তর সাধারণত জটিল...বহু-স্তরের পচন, পুনর্গঠন, এবং থ্রেশহোল্ড ডিনয়াইজিংধাপ:

সম্পূর্ণ তরঙ্গ বিশ্লেষণ কর্মপ্রবাহ:

  1. বহু-স্কেল পচন → আনুমানিক সহগ এবং বিশদ সহগ উৎপন্ন করে।
  2. থ্রেশহোল্ডিং → শব্দ কমাতে বিস্তারিত সহগের জন্য নরম/কঠিন থ্রেশহোল্ডিং
  3. বিপরীত রূপান্তর পুনর্গঠন → প্রক্রিয়াজাত সহগগুলিকে সংকেতে পুনরুদ্ধার করা
  4. সীমানা সম্প্রসারণ → সংকেত সীমানা প্রভাব পরিচালনা করা
  5. শক্তি স্বাভাবিকীকরণ → রূপান্তরের আগে এবং পরে শক্তি সংরক্ষণ নিশ্চিত করে

কিন্তুআর্থিক লেনদেনের ব্যবহারিক প্রয়োগচীনে, আমাদের এটি এত জটিল হওয়ার দরকার নেই। কারণ:

১. ট্রেডিংয়ের জন্য শুধুমাত্র ট্রেন্ডের দিকনির্দেশনা প্রয়োজন; একটি নিখুঁত পুনর্গঠনের প্রয়োজন হয় না।

একাডেমিক গবেষণার জন্য 0.01% এর কম পুনর্গঠন ত্রুটির প্রয়োজন হতে পারে, তবে ট্রেডিংয়ে, দাম বাড়বে নাকি কমবে তা নির্ধারণ করার জন্য এটি যথেষ্ট। পুনর্গঠনে 5% ত্রুটি থাকলেও, কৌশলটি এখনও লাভজনক হতে পারে যতক্ষণ না প্রবণতার দিক সঠিক থাকে।

2. রিয়েল-টাইম প্রয়োজনীয়তা গণনাকে সহজ করে তোলে।

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

৩. আর্থিক সংকেতের বিশেষ বৈশিষ্ট্য

আর্থিক মূল্য স্থিতিশীল সংকেত নয় এবং কঠোর চক্রাকারে পরিবর্তিত হয় না। জটিল ফ্রিকোয়েন্সি বিভাজন এখানে খুব একটা অর্থবহ নয়; সহজ ট্রেন্ড নিষ্কাশন আরও ব্যবহারিক।

এই সরলীকরণ কৌশল

অতএব, এই প্রবন্ধটিতরঙ্গ রূপান্তরের সারাংশ বের করাআর্থিক বাজারের সবচেয়ে ব্যবহারিক দিকগুলির উপর দৃষ্টি নিবদ্ধ করা:

মূল সরলীকরণ ১: শুধুমাত্র আনুমানিক সহগ ব্যবহার করুন (কম-ফ্রিকোয়েন্সি প্রবণতা)

ঐতিহ্যবাহী তরঙ্গলেপ বিভাজন → আনুমানিক সহগ + বিস্তারিত সহগ (বহু-স্তর)
এই প্রয়োগ: শুধুমাত্র আনুমানিক সহগ ধরে রাখা → সরাসরি মসৃণ প্রবণতা অর্জন করা।

মূল সরলীকরণ ২: থ্রেশহোল্ডিং ডিনয়েজিং ছাড়াই সরাসরি কনভলিউশন

ঐতিহ্যবাহী তরঙ্গলেপ পচন → বিস্তারিত সহগের প্রান্তিককরণ → পুনর্গঠন
এই অ্যাপ্লিকেশন: মসৃণ দাম পেতে সরাসরি কনভোলিউশন →

মূল সরলীকরণ ৩: সীমানা প্রক্রিয়াকরণ উপেক্ষা করুন

ঐতিহ্যবাহী তরঙ্গের জন্য প্রতিসম সম্প্রসারণ এবং সংকেত সীমানার পর্যায়ক্রমিক সম্প্রসারণের মতো প্রক্রিয়াকরণের প্রয়োজন হয়।
এই অ্যাপ্লিকেশনটি শুধুমাত্র মধ্যম অংশের উপর দৃষ্টি নিবদ্ধ করে; সীমানা ত্রুটি গ্রহণযোগ্য।

বাস্তবায়ন পদ্ধতি: ফিল্টার কনভোলিউশন

python
def convolve(src, coeffs, step): """ 核心算法:用小波系数对价格序列做加权平均 src: 价格序列 [100000, 101000, 99000, ...] coeffs: 小波系数 [0.483, 0.837, 0.224, -0.129] step: 采样步长(用于多层级) """ sum_val = 0.0 # 加权和 sum_w = 0.0 # 权重和 for i, weight in enumerate(coeffs): idx = i * step if idx < len(src): sum_val += src[idx] * weight sum_w += weight return sum_val / sum_w # 归一化

এই ফাংশনটি...তরঙ্গ ফিল্টারের মূল অংশ

  • প্রতিটি ক্যান্ডেলস্টিকের জন্য, এটি N ক্যান্ডেলস্টিকের দিকে ফিরে তাকায় (N = তরঙ্গ সহগের সংখ্যা)।
  • ওজন হিসেবে তরঙ্গ সহগ ব্যবহার করে ওজনযুক্ত গড় গণনা করুন।
  • সামঞ্জস্য করেstepপ্যারামিটারগুলি বহু-স্তরের মসৃণকরণ সক্ষম করে (স্তর 1/2/3...)।

এই সরলীকরণ কেন যুক্তিসঙ্গত?

কারণ লেনদেনের অপরিহার্য প্রয়োজনীয়তা হল:শব্দের প্রবণতা খুঁজে বের করাতরঙ্গ রূপান্তরের আনুমানিক সহগগুলি নিজেই সংকেতের জন্য একটি "লো-পাস ফিল্টার", যা কম-ফ্রিকোয়েন্সি ট্রেন্ড উপাদানগুলিকে সংরক্ষণ করে, যা আমাদের ঠিক যা প্রয়োজন।

যদিও সম্পূর্ণ তরঙ্গ বিশ্লেষণ আরও সুনির্দিষ্ট, আর্থিক ব্যবসায়ে:

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

তথ্য অর্জন: FMZ প্ল্যাটফর্মের সুবিধা

ব্যবহারইনভেনটর কোয়ান্টাইজেশন (FMZ) প্ল্যাটফর্মের স্থানীয় ব্যাকটেস্টিং ইঞ্জিনতথ্য সংগ্রহ করা খুবই সুবিধাজনক!

python
'''backtest start: 2025-12-17 00:00:00 end: 2025-12-23 08:00:00 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","fee":[0,0]}] ''' from fmz import * task = VCtx(__doc__) def main(): exchange.SetCurrency("BTC_USDT") exchange.SetContractType("swap") records = exchange.GetRecords(PERIOD_H1, 500) return records records = main()

কোনও জটিল API ইন্টিগ্রেশন বা ডেটা পরিষ্কারের প্রয়োজন নেই; স্ট্যান্ডার্ডাইজড ক্যান্ডেলস্টিক ডেটা সরাসরি পাওয়া যেতে পারে। এটি আমাদের ডেটা প্রক্রিয়াকরণে আটকে থাকার পরিবর্তে সাতটি তরঙ্গের ধরণের প্রকৃত প্রভাবগুলি দ্রুত যাচাই করতে সহায়তা করে।

পরীক্ষার লক্ষ্য

ক্রিপ্টোকারেন্সির দামের উপর সাতটি সাধারণ তরঙ্গের ধরণ (হার, ডাউবেচিস ৪, সিমলেট ৪, বায়োর্থোগোনাল ৩.৩, মেক্সিকান হ্যাট, মরলেট এবং ডিসক্রিট মেয়ার) এর কর্মক্ষমতা তুলনা করে, নিম্নলিখিত দৃশ্যমান প্রদর্শন প্রদান করা হয়েছে:

  • বিভিন্ন তরঙ্গের মধ্যে মসৃণকরণের তীব্রতার পার্থক্য
  • একই তরঙ্গের বিভিন্ন স্তরে প্রভাবের তারতম্য
  • কোন তরঙ্গগুলি স্বল্পমেয়াদী ট্রেডিংয়ের জন্য উপযুক্ত এবং কোনগুলি ট্রেন্ড অনুসরণের জন্য উপযুক্ত?

**গাণিতিক উৎপত্তির কঠোরতার উপর নয়, বরং ব্যবহারিক ফলাফলের চাক্ষুষ তুলনার উপর জোর দেওয়া হচ্ছে।**এটি ব্যবসায়ীদের একটি স্বজ্ঞাত বোধগম্যতা বিকাশে এবং তাদের কৌশল অনুসারে তরঙ্গের ধরণ বেছে নিতে সহায়তা করে।


IV. ৭টি তরঙ্গের প্রকারের বিস্তারিত ব্যাখ্যা

1. হর তরঙ্গ-সরলতম গড়

হার তরঙ্গ হল সবচেয়ে মৌলিক ধরণের তরঙ্গ, যার মাত্র দুটি সহগ রয়েছে:[0.5, 0.5]মূলত, এটি দুটি সংলগ্ন দামের একটি সাধারণ গড়।

মূল কোড:

python
coeffs = [0.5, 0.5] # 对价格序列 [100000, 101000, 99000, 102000, 98000] 处理 def smooth(prices, i): return (prices[i] * 0.5 + prices[i-1] * 0.5) / 1.0 # 结果:[100000, 100500, 100000, 100500, 100000]

আপনি দেখতে পাচ্ছেন, হার প্রক্রিয়াকরণের পরে প্রাথমিকভাবে অত্যন্ত ওঠানামা করা দাম (৯৯,০০০ থেকে ১০২,০০০ পর্যন্ত) তুলনামূলকভাবে স্থিতিশীল হয়ে ওঠে। এটি তরঙ্গের "ডিনয়াইজিং" এর প্রভাব - স্বল্পমেয়াদী, তীব্র ওঠানামা মসৃণ করে, যা আপনাকে একটি মসৃণ দামের প্রবণতা দেখতে দেয়।

img


২. ডাউবেচিজ ৪ - সাধারণত ইঞ্জিনিয়ারিং প্রকল্পে ব্যবহৃত হয়

ডাউবেচিজ ৪ (সংক্ষেপে db4) হল প্রকৌশলে সর্বাধিক ব্যবহৃত তরঙ্গপত্রগুলির মধ্যে একটি। এর সহগগুলি হল:[0.483, 0.837, 0.224, -0.129]মনে রাখবেন যে শেষ সহগ হল...ঋণাত্মক সংখ্যাএটাই এটিকে অনন্য করে তোলে।

মূল কোড:

python
coeffs = [0.483, 0.837, 0.224, -0.129] # 处理第i个价格点 def smooth(prices, i): weighted_sum = (prices[i] * 0.483 + # 当前价格 prices[i-1] * 0.837 + # 前1根,权重最大! prices[i-2] * 0.224 + # 前2根 prices[i-3] * (-0.129)) # 前3根,负权重 weight_sum = 0.483 + 0.837 + 0.224 + (-0.129) # = 1.415 return weighted_sum / weight_sum # 示例:smooth([100000, 101000, 99000, 102000], 3) ≈ 100251

**মূল বৈশিষ্ট্য:**পূর্ববর্তী ক্যান্ডেলস্টিকের ওজন (0.837) বর্তমান মূল্যের (0.483) চেয়ে বেশি! এর অর্থ হল db4 "সদ্য ঘটে যাওয়া মূল্য"-এর উপর বেশি জোর দেয় এবং ঋণাত্মক ওজন সহগ পূর্ববর্তী মূল্যের উপর "অফসেটিং" প্রভাব ফেলবে, যা মসৃণতা আরও বাড়িয়ে তুলবে।

img


৩. সিমলেট ৪ - একটি প্রতিসম উন্নত সংস্করণ

সিমলেট ৪ হল ডাউবেচিজের একটি উন্নত সংস্করণ, যা আরও ভালো প্রতিসাম্যের লক্ষ্যে কাজ করে। সহগ:[-0.076, -0.030, 0.498, 0.804, 0.298, -0.099, -0.013, 0.032]

মূল কোড:

python
coeffs = [-0.076, -0.030, 0.498, 0.804, 0.298, -0.099, -0.013, 0.032] # 向前看8根K线 def smooth(prices, i): weighted_sum = sum(prices[i-j] * coeffs[j] for j in range(8)) weight_sum = sum(coeffs) return weighted_sum / weight_sum # 平滑效果比Haar和db4都强,但反应速度更慢

**মূল বৈশিষ্ট্য:**৮টি ক্যান্ডেলস্টিকের একটি উইন্ডো দৈর্ঘ্য দামের দীর্ঘ "স্মৃতি" তৈরি করতে সাহায্য করে। ৮টি ক্যান্ডেলস্টিক অতিক্রম না করা পর্যন্ত একটি মসৃণ বক্ররেখায় একটি সত্যিকারের ট্রেন্ড রিভার্সাল দৃশ্যমান নাও হতে পারে।

img


৪. বায়োর্থোগোনাল ৩.৩ - নিখুঁত প্রতিসাম্য

বায়োর্থোগোনাল ৩.৩ (সংক্ষেপে bior3.3) হল সহগ সহ একটি সম্পূর্ণ প্রতিসম তরঙ্গ:[-0.066, 0.283, 0.637, 0.283, -0.066]

মূল কোড:

python
coeffs = [-0.066, 0.283, 0.637, 0.283, -0.066] # ↑ 中心↑ ↑ # 完全对称的两端 # 处理中间价格点 def smooth(prices, i): # 实际应用:只向前看,不使用未来数据 weighted_sum = (prices[i-4] * (-0.066) + # 前4根 prices[i-3] * 0.283 + # 前3根 prices[i-2] * 0.637 + # 前2根,权重最大 prices[i-1] * 0.283 + # 前1根 prices[i] * (-0.066)) # 当前 weight_sum = sum(coeffs) # = 1.071 return weighted_sum / weight_sum

**মূল বৈশিষ্ট্য:**প্রতিসাম্য নিশ্চিত করে যে কোনও "ফেজ বিকৃতি" নেই - মসৃণ বক্ররেখা ব্যাখ্যাতীতভাবে বাম বা ডানে স্থানান্তরিত হবে না।

img


৫. মেক্সিকান টুপি - টার্নিং পয়েন্ট হান্টার

মেক্সিকান হ্যাট (যাকে রিকার ওয়েভলেটও বলা হয়) সহগ:[-0.1, 0.0, 0.4, 0.8, 0.4, 0.0, -0.1]এটি মেক্সিকান সোম্বেরোর মতো আকৃতির।

মূল কোড:

python
coeffs = [-0.1, 0.0, 0.4, 0.8, 0.4, 0.0, -0.1] # 负值 零 正值 最大 正值 零 负值 # ↓ ↓ # "惩罚"两端,增强拐点检测能力 def smooth(prices, i): weighted_sum = (prices[i-6] * (-0.1) + # 左3,负权重 prices[i-5] * 0.0 + # 左2 prices[i-4] * 0.4 + # 左1 prices[i-3] * 0.8 + # 中心,权重最大 prices[i-2] * 0.4 + # 右1 prices[i-1] * 0.0 + # 右2 prices[i] * (-0.1)) # 右3,负权重 weight_sum = sum(coeffs) return weighted_sum / weight_sum

**মূল বৈশিষ্ট্য:**এর "মাঝখানে বড়, উভয় প্রান্তে ঋণাত্মক" গঠন এটিকে সনাক্তকরণে বিশেষভাবে ভালো করে তোলে।বাঁক বিন্দু- সেই গুরুত্বপূর্ণ মুহূর্ত যখন দাম ঊর্ধ্বমুখী প্রবণতা থেকে নিম্নমুখী প্রবণতায় (অথবা বিপরীত) ফিরে আসে। ঋণাত্মক ওজন সহগ দূরবর্তী দামগুলিকে "দণ্ড" দেয়, দ্রুত প্রবণতা পরিবর্তনগুলি ধরে রাখে।

img


৬. মোরলেট - গাউসিয়ান স্মুথিংয়ের রাজা

মোরলেট তরঙ্গ একটি গাউসীয় (স্বাভাবিক) বন্টনের উপর ভিত্তি করে তৈরি, যার সহগগুলি হল:[0.0625, 0.25, 0.375, 0.25, 0.0625]

মূল কোড:

python
coeffs = [0.0625, 0.25, 0.375, 0.25, 0.0625] # ↓ ↓ ↓中心 ↓ ↓ # 远端 近端 最高 近端 远端 # 完美的高斯钟形曲线 def smooth(prices, i): weighted_sum = (prices[i-4] * 0.0625 + # 左2,6.25% prices[i-3] * 0.25 + # 左1,25% prices[i-2] * 0.375 + # 中心,37.5% prices[i-1] * 0.25 + # 右1,25% prices[i] * 0.0625) # 右2,6.25% # 权重和正好 = 1.0,无需除法 return weighted_sum

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

img


৭. ডিসক্রিট মেয়ার - আলটিমেট স্মুথিং

ডিসক্রিট মেয়ার তরঙ্গ হল সবচেয়ে জটিল তরঙ্গ, যার সহগ রয়েছে:[-0.015, -0.025, 0.0, 0.28, 0.52, 0.28, 0.0, -0.025, -0.015]

মূল কোড:

python
coeffs = [-0.015, -0.025, 0.0, 0.28, 0.52, 0.28, 0.0, -0.025, -0.015] # ↑ ↑ ↑ ↑中心↑ ↑ ↑ ↑ # 完全对称,中心权重超过50% def smooth(prices, i): # 向前看9根K线 weighted_sum = sum(prices[i-j] * coeffs[j] for j in range(9)) weight_sum = sum(coeffs) # = 1.0 return weighted_sum # 注意:第4根之前的K线权重是0.52,超过50%! # 实际上在告诉你"4根K线之前的中期趋势"

**মূল বৈশিষ্ট্য:**এর সহগ সর্বাধিক (9), ঐতিহাসিক তথ্য দীর্ঘতম এবং মসৃণকরণের প্রভাব সবচেয়ে শক্তিশালী। এটি "সাপ্তাহিক প্রবণতা" বের করার জন্য উপযুক্ত, তবে এতে বিশাল বিলম্ব রয়েছে - এমনকি যদি দাম 10% কমে যায়, তবুও এর বক্ররেখা "ক্রমবর্ধমান" দেখাতে পারে।

img


৫. স্মুথিং এফেক্টের মধ্যে পার্থক্য কেন?

সাত ধরণের তরঙ্গপাত পর্যালোচনা করার পর, আপনার একটি প্যাটার্ন লক্ষ্য করা উচিত ছিল:

আরও সহগ = আরও দেখুন = শক্তিশালী মসৃণকরণ = বৃহত্তর বিলম্বিতা

হর (২টি সহগ) → শুধুমাত্র ১ বার দেখুন → প্রায় মসৃণ নয়
ডাউবেচিজ ৪ (৪ টুকরা) → আগে ৩টি দেখুন → সামান্য মসৃণ
মেক্সিকান টুপি (৭) → ৬টি আগে দেখুন → মাঝারি স্মুথিং
ডিসক্রিট মেয়ার (9) → 8 বার দেখার আগে → ভারী স্মুথিং

নেতিবাচক ওজনের প্রভাব হল সংবেদনশীলতা বৃদ্ধি করা এবং পরিবর্তনগুলি সনাক্ত করা সহজ করে তোলা।

হর/মরলেট (ঋণাত্মক ওজন নেই) → মৃদু এবং মসৃণ, অসংবেদনশীল
মেক্সিকান টুপি (উভয় প্রান্তে ঋণাত্মক) → ইনফ্লেকশন পয়েন্টের প্রতি সংবেদনশীল
ডাউবেচিজ ৪ (ঋণাত্মক) → ট্রেন্ড পরিবর্তনের প্রতি সংবেদনশীল

প্রতিসাম্যের ভূমিকা = কোনও বিকৃতি না হওয়া = মূল আকৃতি বজায় রাখা

অসামঞ্জস্য (ডাউবেচিস) → বাম/ডানে স্থানান্তরিত হতে পারে
প্রতিসাম্য (বায়োর্থোগোনাল/মেয়ার) → কেন্দ্রীয় অবস্থান বজায় রাখা


ষষ্ঠ। মসৃণকরণ স্তরের প্রভাব

ওয়েভলেট ট্রান্সফর্ম পুনরাবৃত্তভাবে প্রয়োগ করা যেতে পারে, যেমন নেস্টিং পুতুল। প্রথম প্রয়োগটিকে বলা হয় স্তর 1, স্তর 1 এর ফলাফলে এটি আবার প্রয়োগ করাকে বলা হয় স্তর 2, ইত্যাদি।

বিভিন্ন স্তরে দেখা সময়ের স্কেল:

ধরে নিচ্ছি আমরা BTC ট্রেডিংয়ের জন্য ১-ঘন্টা ক্যান্ডেলস্টিক চার্ট ব্যবহার করি:

স্তর ১ → ২-৪ ঘন্টা ধরে স্বল্পমেয়াদী ওঠানামা পর্যবেক্ষণ করুন
লেভেল ২ → ৪-৮ ঘন্টা ধরে ট্রেন্ড পর্যবেক্ষণ করুন
স্তর ৩ → ১-২ দিন ধরে মধ্যমেয়াদী প্রবণতা পর্যবেক্ষণ করুন (সাধারণত ব্যবহৃত কৌশল)
স্তর ৪ → ২-৪ দিনের মূল্য পরিসীমা পর্যবেক্ষণ করুন
স্তর ৫ → ৪-৮ দিনের প্রধান প্রবণতাগুলি পর্যবেক্ষণ করুন

প্রকৃত ফলাফলের তুলনা:

মূল বিটিসি মূল্য (১-ঘণ্টার চার্ট):99500, 99800, 99200, 100200, 99800, 100500, 100100, ...

লেভেল ১ প্রসেসিং: ৯৯৬০০, ৯৯৬৫০, ৯৯৫০০, ৯৯৯০০, ৯৯৯৫০, ১০০২০০, ১০০২৫০, ...
(সামান্য মসৃণ করা হয়েছে, কিন্তু ওঠানামা এখনও দৃশ্যমান)

লেভেল ৩ প্রসেসিং: ৯৯৬২০, ৯৯৬৫০, ৯৯৭০০, ৯৯৮০০, ৯৯৯৫০, ১০০১০০, ১০০২০০, ...
(মসৃণ করা হয়েছে, একটি মধ্যমেয়াদী প্রবণতা নির্দেশ করে)

লেভেল ৫ প্রক্রিয়াকরণ: ৯৯৬৩০, ৯৯৬৪০, ৯৯৬৬০, ৯৯৭০০, ৯৯৭৬০, ৯৯৮৪০, ৯৯৯৩০, ...
(অত্যন্ত মসৃণ, শুধুমাত্র সাধারণ দিক দেখাচ্ছে)

img
img
img
img
img

নির্বাচনের নীতিটি সহজ: আপনার ধারণ সময়ের উপর ভিত্তি করে সংশ্লিষ্ট স্তরটি ব্যবহার করুন।

১৫ মিনিটের স্ক্যাল্পিং → লেভেল ১-২
ইন্ট্রাডে ট্রেডিং → লেভেল ২-৩
কয়েকদিন সুইং করুন → লেভেল ৩-৪
দীর্ঘমেয়াদী প্রবণতা বিশ্লেষণ → স্তর 4-5


VII. ব্যবহারিক প্রয়োগের ধারণা

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

python
# 执行小波变换 transformed = transformer.transform_ohlc(df) # 获取最近两根K线的平滑收盘价 w_close_current = transformed['w_close'].values[-1] # 当前平滑收盘价 w_close_prev = transformed['w_close'].values[-2] # 前一根平滑收盘价 # 判断趋势方向 signal = 0 if w_close_current > w_close_prev: signal = 1 # 平滑价格向上 → 做多 elif w_close_current < w_close_prev: signal = -1 # 平滑价格向下 → 做空 # 获取账户信息 account = exchange.GetAccount() ticker = exchange.GetTicker() if not account or not ticker: Log("[Warning] Failed to get account/ticker info") Sleep(5000) continue current_price = ticker['Last'] Log(f"[Price] 原始: {df['Close'].values[-1]:.2f}, " f"平滑当前: {w_close_current:.2f}, 平滑前值: {w_close_prev:.2f}") Log(f"[Trend] {'↑ 向上' if signal == 1 else '↓ 向下' if signal == -1 else '→ 横盘'}") # 执行交易逻辑 if signal == 1 and position != 1: # 平滑价格向上 → 做多 Log(f"[信号] 趋势向上,开多 @ {current_price:.2f}") if position == -1: # 先平空仓 exchange.SetDirection("closesell") exchange.Buy(current_price, 1) Log(f"[平仓] 平空仓") # 开多仓 exchange.SetDirection("buy") exchange.Buy(current_price, 1) Log(f"[开仓] 开多仓") position = 1 elif signal == -1 and position != -1: # 平滑价格向下 → 做空 Log(f"[信号] 趋势向下,开空 @ {current_price:.2f}") if position == 1: # 先平多仓 exchange.SetDirection("closebuy") exchange.Sell(current_price, 1) Log(f"[平仓] 平多仓") # 开空仓 exchange.SetDirection("sell") exchange.Sell(current_price, 1) Log(f"[开仓] 开空仓") position = -1 else: Log(f"[持仓] 当前{'多头' if position == 1 else '空头' if position == -1 else '空仓'},无需操作")

img

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

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


অষ্টম। উপসংহার: "ত্রিমুখী পদ্ধতির" একটি যুক্তিসঙ্গত দৃষ্টিভঙ্গি

ব্যবহারিক মসৃণকরণ প্রভাবের ক্ষেত্রে, তরঙ্গ রূপান্তর প্রকৃতপক্ষে আর্থিক তথ্য প্রক্রিয়াকরণে ভূমিকা পালন করতে পারে: এটি কিছু স্বল্পমেয়াদী শব্দ ফিল্টার করতে পারে এবং তুলনামূলকভাবে স্পষ্ট প্রবণতা তথ্য বের করতে সাহায্য করতে পারে। তবে, এই কৌশলটিরও উল্লেখযোগ্য সীমাবদ্ধতা রয়েছে—**ল্যাগের সমস্যা সম্পূর্ণরূপে এড়ানো যাবে না।**তবে, এটি কেবল ঐতিহাসিক তথ্য প্রক্রিয়া করতে পারে এবং ভবিষ্যতের প্রবণতা ভবিষ্যদ্বাণী করতে পারে না। তদুপরি, শুধুমাত্র তরঙ্গ রূপান্তর ব্যবহারের প্রভাব তুলনামূলকভাবে সীমিত; একটি সম্পূর্ণ ট্রেডিং সিস্টেম তৈরি করতে এটিকে অন্যান্য বিশ্লেষণাত্মক পদ্ধতি এবং ঝুঁকি নিয়ন্ত্রণ ব্যবস্থার সাথে একত্রিত করতে হবে।

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

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

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

প্লটিং ফাংশন: উদ্ভাবকের স্থানীয় ব্যাকটেস্টিং ইঞ্জিনে প্রয়োগ করা হয়েছে

python
'''backtest start: 2025-12-17 00:00:00 end: 2025-12-23 08:00:00 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","fee":[0,0]}] ''' from fmz import * import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib.patches import Rectangle task = VCtx(__doc__) # ==================== 小波系数库 ==================== class WaveletCoefficients: """Wavelet Coefficients Definition""" @staticmethod def get_coeffs(wavelet_name): """Get coefficients for different wavelet types""" coeffs = { "Haar": [0.5, 0.5], "Daubechies 4": [ 0.48296291314453414, 0.8365163037378079, 0.22414386804201339, -0.12940952255126037 ], "Symlet 4": [ -0.05357, -0.02096, 0.35238, 0.56833, 0.21062, -0.07007, -0.01941, 0.03268 ], "Biorthogonal 3.3": [ -0.06629, 0.28289, 0.63678, 0.28289, -0.06629 ], "Mexican Hat (Ricker)": [ -0.1, 0.0, 0.4, 0.8, 0.4, 0.0, -0.1 ], "Morlet (Gaussian)": [ 0.0625, 0.25, 0.375, 0.25, 0.0625 ], "Discrete Meyer (Dmey)": [ -0.015, -0.025, 0.0, 0.28, 0.52, 0.28, 0.0, -0.025, -0.015 ] } return coeffs.get(wavelet_name, coeffs["Mexican Hat (Ricker)"]) # ==================== 小波变换引擎 ==================== class WaveletTransform: """Wavelet Transform Engine""" def __init__(self, wavelet_type="Mexican Hat (Ricker)", smoothing_level=3): self.wavelet_type = wavelet_type self.smoothing_level = smoothing_level self.coeffs = WaveletCoefficients.get_coeffs(wavelet_type) def convolve(self, src, coeffs, step): """ Convolution operation - Core algorithm Args: src: Source data sequence coeffs: Wavelet coefficients step: Sampling step Returns: Convolved value """ sum_val = 0.0 sum_w = 0.0 for i, weight in enumerate(coeffs): idx = i * step if idx < len(src): val = src[idx] sum_val += val * weight sum_w += weight # Normalization - Critical fix return sum_val / sum_w if sum_w != 0 else sum_val def calc_level(self, data, target_level): """ Calculate wavelet transform for specified level Args: data: Original data array target_level: Target smoothing level Returns: Transformed data array """ result = [] coeffs = self.coeffs for i in range(len(data)): # Get data from current position backwards src = data[max(0, i - 50):i + 1][::-1] # Level 1 val = self.convolve(src, coeffs, 1) # Level 2 if target_level >= 2: src_temp = [val] + [self.convolve(data[max(0, j - 50):j + 1][::-1], coeffs, 1) for j in range(max(0, i - 10), i)][::-1] val = self.convolve(src_temp, coeffs, 2) # Level 3 if target_level >= 3: val = self.convolve([val] * len(coeffs), coeffs, 4) # Level 4+ if target_level >= 4: val = self.convolve([val] * len(coeffs), coeffs, 8) result.append(val) return np.array(result) def transform_ohlc(self, df): """ Perform wavelet transform on OHLC data Args: df: DataFrame with Open/High/Low/Close Returns: Transformed DataFrame """ result_df = df.copy() # Transform each price series result_df['w_open'] = self.calc_level(df['Open'].values, self.smoothing_level) result_df['w_high'] = self.calc_level(df['High'].values, self.smoothing_level) result_df['w_low'] = self.calc_level(df['Low'].values, self.smoothing_level) result_df['w_close'] = self.calc_level(df['Close'].values, self.smoothing_level) # Reconstruct logically consistent candlesticks result_df['real_high'] = result_df[['w_high', 'w_low', 'w_open', 'w_close']].max(axis=1) result_df['real_low'] = result_df[['w_high', 'w_low', 'w_open', 'w_close']].min(axis=1) return result_df # ==================== K线图可视化工具 ==================== class WaveletCandlestickVisualizer: """Wavelet Candlestick Visualization""" @staticmethod def plot_single_wavelet(df, wavelet_type, smoothing_level=3, n_bars=200): """ Plot single wavelet type comparison Args: df: Original candlestick data wavelet_type: Wavelet type smoothing_level: Smoothing level n_bars: Number of bars to display """ # Take only last n_bars df_plot = df.iloc[-n_bars:].copy() # Create figure fig, ax = plt.subplots(figsize=(20, 8)) # Perform wavelet transform transformer = WaveletTransform(wavelet_type, smoothing_level) transformed = transformer.transform_ohlc(df) transformed_plot = transformed.iloc[-n_bars:].copy() # Draw original candlesticks (gray background) WaveletCandlestickVisualizer._draw_candlesticks( ax, df_plot, color_up='lightgray', color_down='lightgray', alpha=0.3, label='Original Candles' ) # Draw wavelet smoothed candlesticks WaveletCandlestickVisualizer._draw_candlesticks( ax, transformed_plot, use_wavelet=True, color_up='#26A69A', # Green color_down='#EF5350', # Red alpha=0.9, linewidth=1.2, label=f'{wavelet_type} Smoothed (Level {smoothing_level})' ) # Set title and labels ax.set_title(f'{wavelet_type} Wavelet (Level {smoothing_level}) - Candlestick Comparison', fontsize=16, fontweight='bold', pad=20) ax.set_ylabel('Price (USDT)', fontsize=13) ax.set_xlabel('Time', fontsize=13) ax.grid(True, alpha=0.2, linestyle='--') ax.legend(loc='upper left', fontsize=12) # Format x-axis ax.set_xlim(-1, len(df_plot)) ax.set_xticks(range(0, len(df_plot), max(1, len(df_plot) // 10))) ax.set_xticklabels([df_plot.index[i].strftime('%m-%d %H:%M') for i in range(0, len(df_plot), max(1, len(df_plot) // 10))], rotation=45, ha='right') plt.tight_layout() plt.show() return fig @staticmethod def plot_single_level(df, wavelet_type, level, n_bars=200): """ Plot single smoothing level Args: df: Original candlestick data wavelet_type: Wavelet type level: Smoothing level n_bars: Number of bars to display """ # Take only last n_bars df_plot = df.iloc[-n_bars:].copy() # Create figure fig, ax = plt.subplots(figsize=(20, 8)) # Perform wavelet transform transformer = WaveletTransform(wavelet_type, level) transformed = transformer.transform_ohlc(df) transformed_plot = transformed.iloc[-n_bars:].copy() # Draw original candlesticks WaveletCandlestickVisualizer._draw_candlesticks( ax, df_plot, color_up='lightgray', color_down='lightgray', alpha=0.3, label='Original Candles' ) # Draw wavelet smoothed candlesticks WaveletCandlestickVisualizer._draw_candlesticks( ax, transformed_plot, use_wavelet=True, color_up='#26A69A', color_down='#EF5350', alpha=0.9, linewidth=1.2, label=f'Level {level} Smoothed' ) # Set title and labels ax.set_title(f'{wavelet_type} - Smoothing Level {level} Effect', fontsize=16, fontweight='bold', pad=20) ax.set_ylabel('Price (USDT)', fontsize=13) ax.set_xlabel('Time', fontsize=13) ax.grid(True, alpha=0.2, linestyle='--') ax.legend(loc='upper left', fontsize=12) # Format x-axis ax.set_xlim(-1, len(df_plot)) ax.set_xticks(range(0, len(df_plot), max(1, len(df_plot) // 10))) ax.set_xticklabels([df_plot.index[i].strftime('%m-%d %H:%M') for i in range(0, len(df_plot), max(1, len(df_plot) // 10))], rotation=45, ha='right') plt.tight_layout() plt.show() return fig @staticmethod def _draw_candlesticks(ax, df, use_wavelet=False, color_up='green', color_down='red', alpha=1.0, linewidth=1.0, label=''): """ Draw candlestick chart Args: ax: Matplotlib axis df: Data DataFrame use_wavelet: Whether to use wavelet data color_up: Up color color_down: Down color alpha: Transparency linewidth: Line width label: Legend label """ if use_wavelet: opens = df['w_open'].values highs = df['real_high'].values lows = df['real_low'].values closes = df['w_close'].values else: opens = df['Open'].values highs = df['High'].values lows = df['Low'].values closes = df['Close'].values for i in range(len(df)): x = i open_price = opens[i] high_price = highs[i] low_price = lows[i] close_price = closes[i] color = color_up if close_price >= open_price else color_down # Draw wick ax.plot([x, x], [low_price, high_price], color=color, linewidth=linewidth, alpha=alpha) # Draw body height = abs(close_price - open_price) bottom = min(open_price, close_price) rect = Rectangle((x - 0.3, bottom), 0.6, height, facecolor=color, edgecolor=color, alpha=alpha, linewidth=linewidth) ax.add_patch(rect) # Add legend (only once) if label: ax.plot([], [], color=color_up, linewidth=3, alpha=alpha, label=label) # ==================== 主函数 ==================== def main(): """Main execution flow""" exchange.SetCurrency("BTC_USDT") exchange.SetContractType("swap") # Get candlestick data records = exchange.GetRecords(PERIOD_H1, 500) # Convert to DataFrame df = pd.DataFrame(records, columns=['Time', 'Open', 'High', 'Low', 'Close', 'Volume']) df['Time'] = pd.to_datetime(df['Time'], unit='ms') df.set_index('Time', inplace=True) print(f"Data loaded: {len(df)} bars") print(f"Time range: {df.index[0]} to {df.index[-1]}") print(f"Price range: ${df['Low'].min():.2f} - ${df['High'].max():.2f}") return df # ==================== 执行绘图 ==================== try: # Get candlestick data kline = main() print("\n" + "="*70) print("Generating Wavelet Candlestick Charts (Each in Separate Window)...") print("="*70) # ========== Chart Series 1: Different Wavelet Types ========== print("\n[Series 1] Comparing Different Wavelet Types") print("-" * 70) wavelet_types = [ "Haar", "Daubechies 4", "Symlet 4", "Biorthogonal 3.3", "Mexican Hat (Ricker)", "Morlet (Gaussian)", "Discrete Meyer (Dmey)" # ✅ 添加了 Discrete Meyer ] for i, wavelet_type in enumerate(wavelet_types, 1): print(f" Chart {i}/{len(wavelet_types)}: {wavelet_type}") fig = WaveletCandlestickVisualizer.plot_single_wavelet( kline, wavelet_type=wavelet_type, smoothing_level=3, n_bars=150 ) # ========== Chart Series 2: Different Smoothing Levels ========== print("\n[Series 2] Comparing Different Smoothing Levels") print("-" * 70) levels = [1, 2, 3, 4, 5] for i, level in enumerate(levels, 1): print(f" Chart {i}/5: Level {level}") fig = WaveletCandlestickVisualizer.plot_single_level( kline, wavelet_type="Mexican Hat (Ricker)", level=level, n_bars=150 ) print("\n" + "="*70) print("All charts generated successfully!") print(f"Total charts: {len(wavelet_types) + len(levels)} ({len(wavelet_types)} wavelets + {len(levels)} levels)") print("="*70) except Exception as e: print(f"Error: {str(e)}") import traceback print(traceback.format_exc()) finally: print("\nStrategy testing completed.")

লেনদেনের ফাংশন: ইনভেন্টরস প্ল্যাটফর্মে প্রয়োগ করা হয়

python
'''backtest start: 2025-01-17 00:00:00 end: 2025-12-23 08:00:00 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","fee":[0,0]}] ''' import numpy as np import pandas as pd # ==================== 小波系数库 ==================== class WaveletCoefficients: """与上部分函数一致""" # ==================== 小波变换引擎 ==================== class WaveletTransform: """与上部分函数一致""" def main(): """小波交易主函数 - 基于平滑价格趋势""" # ========== 配置参数 ========== WAVELET_TYPE = "Mexican Hat (Ricker)" # 小波类型 SMOOTHING_LEVEL = 1 # 平滑阶数 # 初始化 exchange.SetCurrency("BTC_USDT") exchange.SetContractType("swap") Log(f"=" * 70) Log(f"Wavelet Trend Following Strategy") Log(f"Wavelet: {WAVELET_TYPE}, Level: {SMOOTHING_LEVEL}") Log(f"Logic: 平滑收盘价向上→做多, 平滑收盘价向下→做空") Log(f"=" * 70) # 初始化小波变换器 transformer = WaveletTransform(WAVELET_TYPE, SMOOTHING_LEVEL) # 持仓状态 position = 0 # 0: 无持仓, 1: 多头, -1: 空头 while True: # 获取K线数据 records = exchange.GetRecords(PERIOD_H1, 500) if not records: Log("[Warning] Failed to get kline data") Sleep(5000) continue df = pd.DataFrame(records, columns=['Time', 'Open', 'High', 'Low', 'Close', 'Volume']) df['Time'] = pd.to_datetime(df['Time'], unit='ms') df.set_index('Time', inplace=True) # 执行小波变换 transformed = transformer.transform_ohlc(df) # 获取最近两根K线的平滑收盘价 w_close_current = transformed['w_close'].values[-1] # 当前平滑收盘价 w_close_prev = transformed['w_close'].values[-2] # 前一根平滑收盘价 # 判断趋势方向 signal = 0 if w_close_current > w_close_prev: signal = 1 # 平滑价格向上 → 做多 elif w_close_current < w_close_prev: signal = -1 # 平滑价格向下 → 做空 # 获取账户信息 account = exchange.GetAccount() ticker = exchange.GetTicker() if not account or not ticker: Log("[Warning] Failed to get account/ticker info") Sleep(5000) continue current_price = ticker['Last'] Log(f"[Price] 原始: {df['Close'].values[-1]:.2f}, " f"平滑当前: {w_close_current:.2f}, 平滑前值: {w_close_prev:.2f}") Log(f"[Trend] {'↑ 向上' if signal == 1 else '↓ 向下' if signal == -1 else '→ 横盘'}") # 执行交易逻辑 if signal == 1 and position != 1: # 平滑价格向上 → 做多 Log(f"[信号] 趋势向上,开多 @ {current_price:.2f}") if position == -1: # 先平空仓 exchange.SetDirection("closesell") exchange.Buy(current_price, 1) Log(f"[平仓] 平空仓") # 开多仓 exchange.SetDirection("buy") exchange.Buy(current_price, 1) Log(f"[开仓] 开多仓") position = 1 elif signal == -1 and position != -1: # 平滑价格向下 → 做空 Log(f"[信号] 趋势向下,开空 @ {current_price:.2f}") if position == 1: # 先平多仓 exchange.SetDirection("closebuy") exchange.Sell(current_price, 1) Log(f"[平仓] 平多仓") # 开空仓 exchange.SetDirection("sell") exchange.Sell(current_price, 1) Log(f"[开仓] 开空仓") position = -1 else: Log(f"[持仓] 当前{'多头' if position == 1 else '空头' if position == -1 else '空仓'},无需操作") Log(f"[账户] 余额: {account['Balance']:.2f}, 权益: {account['Equity']:.2f}") Log("-" * 70) Sleep(60000 * 60)
Comment
All comments (0)
No data
No data
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)