[TOC]

یہ مضمون ہے۔عملی تجارت کے لیے ویولیٹ ٹرانسفارم پر ایک مقبول سائنسکوڈ ایک آسان تدریسی ورژن ہے (پیچیدہ مراحل کو چھوڑ کر جیسے ملٹی لیول سڑن، تھریشولڈ ڈینوائزنگ، اور معیاری ویولیٹس کی الٹا ٹرانسفارم ری کنسٹرکشن)، صرف بنیادی خیالات کو برقرار رکھتے ہوئے:رجحان کی معلومات کو نکالنے کے لیے قیمتوں پر کثیر پیمانے پر ہموار کرنے کے لیے ویولیٹ کوفیشینٹس کا استعمال کریں۔حکمت عملی کی ترقی اور تیزی سے توثیق کے لیے موزوں ہے، لیکن علمی تحقیق یا کاغذی اشاعت کے لیے نہیں۔
جو لوگ اکثر Zhihu پر مالی اور مقداری موضوعات کو براؤز کرتے ہیں انہوں نے یقیناً یہ منظر دیکھا ہوگا:
کچھ “ماہرین” کہتے رہتے ہیں:
اس نے سب کو ہکا بکا چھوڑ دیا، جیسے اس نے جوہری ہتھیاروں کی مقداری تجارت میں مہارت حاصل کر لی ہو۔
لیکن آپ چاہتے ہیں کہ وہ آپ کو کوڈ دکھائے؟
“یہ ایک تجارتی راز ہے، اور میں اسے ظاہر نہیں کر سکتا۔”
اس سے اصول کی وضاحت کرنے کو کہیں۔
“اس میں ایڈوانس میتھمیٹکس شامل ہے، اگر میں آپ کو سمجھاؤں تو بھی آپ سمجھ نہیں پائیں گے۔”
آج، ہم ان “Zhihu ماہرین” کی طرف سے کثرت سے ذکر کیے گئے موضوعات کو دریافت کریں گے، جو مالیاتی مارکیٹ میں ویولیٹ ٹرانسفارم کے عملی استعمال کو متعارف کرائیں گے، اور اس ٹیکنالوجی کے بارے میں صحیح فہم پیدا کرنے میں ہر ایک کی مدد کریں گے۔
تصور کریں کہ آپ ایک گانا سن رہے ہیں، لیکن ریکارڈنگ میں پس منظر میں شور ہے:
اصل ریکارڈنگ = انسانی آواز + پس منظر کا شور + جامد
ویولیٹ ٹرانسفارم ایک کی طرح ہے۔اسمارٹ فلٹرز:
مالیاتی مارکیٹ پر جائیں:
اصل قیمت = حقیقی رجحان + قلیل مدتی اتار چڑھاو + بے ترتیب شور
ویولیٹ ٹرانسفارم آپ کی مدد کر سکتا ہے:
ویولیٹ ٹرانسفارم کا جوہر ہے۔“بیس فنکشنز” (ویولٹس) کے مخصوص سیٹ کا استعمال کرتے ہوئے اصل سگنل کو گلنا۔。
تصور کریں کہ آپ کسی شخص کی ظاہری شکل کو بیان کرنا چاہتے ہیں:
مالیاتی قیمتوں میں:
اصل قیمت کا سلسلہ = بنیاد فنکشن 1 × وزن 1 + بنیاد فنکشن 2 × وزن 2 + … + شور
بنیادی افعال “ٹیمپلیٹس” ہیں جو ویولیٹ گتانک کے مطابق ہیں۔ویولیٹ کی مختلف اقسام (ہار، ڈوبیچیز، میکسیکن ہیٹ، وغیرہ) مختلف ٹیمپلیٹس استعمال کرتی ہیں، بالکل اسی طرح جیسے قیمتوں کو گلنے کے لیے مختلف “فیچر ایکسٹریکٹرز” کا استعمال کرتے ہیں۔
ویولیٹ ٹرانسفارم بنیادی طور پر ایک…ملٹی اسکیل فلٹر بینک:
ہائی فریکوئنسی فلٹر → تیزی سے اتار چڑھاؤ کو پکڑتا ہے (روزانہ شور، ٹک لیول کے اتار چڑھاو) انٹرمیڈیٹ فریکوئنسی فلٹر → درمیانی مدت کے رجحانات کو پکڑتا ہے (چند گھنٹوں سے چند دنوں تک کے بینڈ)۔ کم تعدد والے فلٹرز → طویل مدتی رجحانات (ہفتہ وار اور ماہانہ رجحانات) کیپچر کریں۔
اسے “wavelet” کیوں کہا جاتا ہے؟
مالیاتی قیمتوں کا تجزیہ کرنے کے لیے سائن ویوز کے استعمال میں مسئلہ: سائن لہریں فرض کرتی ہیں کہ سگنل وقتاً فوقتاً دہرایا جاتا ہے، لیکن مالیاتی منڈیوں میں ایسا نہیں ہے! BTC آج 10% بڑھ سکتا ہے اور کل 8% گر سکتا ہے، بغیر کسی چکر کے۔
لہروں کے فوائد:لوکلائزیشن کا تجزیہیہ آپ کو بتا سکتا ہے کہ “قیمت کا رجحان بنیادی طور پر 20 دسمبر 2025 کو دوپہر 3 بجے سے شام 5 بجے کے درمیان تھا”، بجائے اس کے کہ “مجموعی طور پر مارکیٹ میں اتار چڑھاؤ” جیسے عام نتیجے پر۔
ویولیٹ ٹرانسفارم ہے۔الٹنے والایہ بہت اہم ہے!
اصل قیمت —> ویولیٹ سڑنا —> ٹرینڈ جزو + اتار چڑھاؤ کا جزو + شور کا جزو رجحان جزو + اتار چڑھاؤ کا جزو + شور کا جزو —> ویولیٹ کی تعمیر نو —> اصل قیمت
ریفیکٹرنگ کا عملیہ انفرادی اجزاء کو گلنا ہے۔منتخب طور پر واپس جوڑیں۔:
تعمیر نو کے دوران صرف ٹرینڈ اجزاء استعمال کریں۔
گلنے کے بعد، مندرجہ ذیل حاصل کیا گیا تھا
اصل لین دین میں، ہم عام طور پرصرف کم تعدد والے حصے کو دوبارہ تشکیل دیں۔(رجحان) اعلی تعدد والے اجزاء (شور) کو براہ راست رد کر دیا جاتا ہے۔ یہ ویولیٹ “شور کی کمی” کا اصول ہے۔
آئیے پیچیدہ انٹیگرل فارمولوں کو چھوڑتے ہیں اور اسے عام آدمی کی شرائط میں بیان کرتے ہیں:
ویولیٹ ٹرانسفارم = “واولیٹ کوفیشینٹس” کے سیٹ کا استعمال کرتے ہوئے قیمت کی سیریز کا وزنی اوسط
بنیادی فارمولا:
ہموار قیمتیں۔[i] = Σ(اصل قیمت)[i-j] × ویولیٹ گتانک[j]) / Σ(ویولیٹ گتانک)[j])
فلٹر نقطہ نظر:
اصل قیمت کو ایک ویولیٹ فلٹر کے ذریعے فلٹر کیا جاتا ہے → مختلف تعدد کے اجزاء “منتخب” ہوتے ہیں۔
کلید ہےویولیٹ گتانک کا انتخاب:
مثال کے طور پر:
فرض کریں کہ آپ Daubechies 4 wavelets استعمال کرتے ہیں، گتانک یہ ہیں۔[0.483, 0.837, 0.224, -0.129]:
گتانک کا یہ سیٹ فلٹر کی وضاحت کرتا ہے:
جب آپ اس فلٹر کو قیمت کی پوری سیریز میں “سلائیڈ” کرتے ہیں تو ویولیٹ ٹرانسفارم مکمل ہو جاتا ہے۔ ہر سلائیڈ میں حسابات شامل ہیں۔موجودہ ونڈو کے اندر قیمتوں کا وزنی اوسطوزن ویولیٹ گتانک ہیں۔
یہ سگنل کیوں “سڑ سکتا ہے”؟
کیونکہ یہ ریاضیاتی طور پر ثابت کیا جا سکتا ہے کہ:کسی بھی سگنل کو ویولیٹ بنیاد کے افعال کے لکیری امتزاج کے طور پر پیش کیا جا سکتا ہے۔جس طرح RGB کے تین بنیادی رنگوں کو ملا کر کوئی بھی رنگ بنایا جا سکتا ہے، ویسے ہی قیمت کی کوئی بھی سیریز ویولیٹ کی بنیاد کے افعال کو ملا کر اخذ کی جا سکتی ہے۔ مختلف ویولیٹ کی اقسام مختلف “بیس فنکشن لائبریریز” فراہم کرتی ہیں، جو مختلف قسم کے سگنل تجزیہ کے لیے موزوں ہیں۔
سگنل پروسیسنگ درسی کتابوں میں، ویولیٹ ٹرانسفارم میں عام طور پر پیچیدہ…ملٹی لیول سڑن، تعمیر نو، اور تھریشولڈ ڈینوائزنگمراحل:
مکمل ویولیٹ تجزیہ ورک فلو:
لیکنمالی لین دین کے عملی اطلاقاتچین میں، ہمیں اسے اتنا پیچیدہ ہونے کی ضرورت نہیں ہے۔ کیونکہ:
1. تجارت کے لیے صرف رجحان کی سمت کی ضرورت ہوتی ہے۔ ایک کامل تعمیر نو ضروری نہیں ہے.
تعلیمی تحقیق میں 0.01% سے کم کی تعمیر نو کی غلطی کی ضرورت ہو سکتی ہے، لیکن تجارت میں، یہ تعین کرنے کے لیے کافی ہے کہ قیمت بڑھے گی یا گرے گی۔ یہاں تک کہ اگر تعمیر نو میں 5% غلطی ہو، تب بھی حکمت عملی تب تک منافع بخش ہو سکتی ہے جب تک کہ رجحان کی سمت درست ہو۔
2. حقیقی وقت کے تقاضے حساب کو آسان بناتے ہیں۔
ایک مکمل ویولیٹ سڑنے کے لیے گتانکوں کی متعدد تہوں کے بار بار کیلکولیشن کی ضرورت ہوتی ہے، جو ہائی فریکوئنسی ٹریڈنگ میں تاخیر کا سبب بن سکتی ہے۔ دوسری طرف براہ راست کنوولوشن، لائیو ٹریڈنگ کی ضروریات کو پورا کرتے ہوئے، ملی سیکنڈ میں مکمل کیا جا سکتا ہے۔
3. مالیاتی اشاروں کی خصوصی خصوصیات
مالیاتی قیمتیں مستحکم سگنل نہیں ہیں اور سخت چکر کا مظاہرہ نہیں کرتی ہیں۔ پیچیدہ فریکوئنسی سڑنا یہاں بہت معنی خیز نہیں ہے۔ سادہ رجحان نکالنا زیادہ عملی ہے۔
لہذا، یہ مضمونویولیٹ ٹرانسفارم کے جوہر کو نکالنامالیاتی منڈیوں کے سب سے زیادہ عملی پہلوؤں پر توجہ مرکوز کرنا:
بنیادی آسانیاں 1: صرف تخمینی قابلیت استعمال کریں (کم تعدد رجحانات)
روایتی ویولیٹ سڑنا → تخمینہ گتانک + تفصیلی گتانک (ملٹی لیئر) یہ ایپلیکیشن: صرف تخمینی کوفیشینٹس کو برقرار رکھنا → براہ راست ہموار رجحان حاصل کرنا۔
بنیادی آسانیاں 2: ڈائریکٹ کنولیشن، بغیر تھریشولڈنگ ڈینوائزنگ کے
روایتی ویولیٹ سڑنا → تفصیلی گتانکوں کی حد بندی → تعمیر نو یہ ایپلیکیشن: ہموار قیمتیں حاصل کرنے کے لیے براہ راست کنولیشن →
بنیادی آسانیاں 3: باؤنڈری پروسیسنگ کو نظر انداز کریں۔
روایتی لہروں کو پروسیسنگ کی ضرورت ہوتی ہے جیسے ہم آہنگی کی توسیع اور سگنل کی حدود کی متواتر توسیع۔ یہ ایپلیکیشن صرف درمیانی حصے پر مرکوز ہے۔ حدود کی غلطیاں قابل قبول ہیں۔
عمل درآمد کا طریقہ: فلٹر کنولیشن
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 # 归一化
یہ فنکشن ہے…ویولیٹ فلٹرز کا بنیادی حصہ:
stepپیرامیٹرز ملٹی لیول اسموتھنگ کو فعال کرتے ہیں (سطح 1/2/3…)۔یہ آسانیاں کیوں معقول ہیں؟
کیونکہ لین دین کی لازمی ضرورت ہے:شور میں رجحانات تلاش کرناویولیٹ ٹرانسفارم کے قربت کے گتانک بذات خود سگنل کے لیے ایک “کم پاس فلٹر” ہیں، جو کم تعدد کے رجحان والے اجزاء کو محفوظ رکھتے ہیں، جو بالکل وہی ہے جس کی ہمیں ضرورت ہے۔
جبکہ مکمل ویولیٹ تجزیہ زیادہ درست ہے، مالیاتی تجارت میں:
استعمال کریںانوینٹر کوانٹائزیشن (FMZ) پلیٹ فارم کا مقامی بیک ٹیسٹنگ انجنڈیٹا حاصل کرنا بہت آسان ہے!
'''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 انضمام یا ڈیٹا کی صفائی کی ضرورت نہیں ہے۔ معیاری کینڈل سٹک ڈیٹا براہ راست حاصل کیا جا سکتا ہے۔ یہ ہمیں ڈیٹا پروسیسنگ میں الجھنے کے بجائے، سات ویولیٹ اقسام کے اصل اثرات کی فوری تصدیق کرنے کی اجازت دیتا ہے۔
کرپٹو کرنسی کی قیمتوں پر سات عام ویولیٹ اقسام (ہار، ڈوبیچیز 4، سملیٹ 4، بائیورتھوگونل 3.3، میکسیکن ہیٹ، مورلیٹ، اور ڈسکریٹ میئر) کی کارکردگی کا موازنہ کرتے ہوئے، درج ذیل بصری مظاہرہ فراہم کیا جاتا ہے:
توجہ ریاضی کے اخذ کی سختی پر نہیں ہے، بلکہ عملی نتائج کے بصری موازنہ پر ہے۔اس سے تاجروں کو ایک بدیہی تفہیم پیدا کرنے اور ویولیٹ کی قسم کا انتخاب کرنے میں مدد ملتی ہے جو ان کی حکمت عملی کے مطابق ہو۔
ہار ویولیٹ ویولیٹ کی سب سے بنیادی قسم ہے، جس میں صرف دو گتانک ہیں:[0.5, 0.5]بنیادی طور پر، یہ دو ملحقہ قیمتوں کا ایک سادہ اوسط ہے۔
بنیادی کوڈ:
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]
جیسا کہ آپ دیکھ سکتے ہیں، اصل میں بے حد اتار چڑھاؤ والی قیمت (99,000 سے 102,000 تک) ہار کی پروسیسنگ کے بعد نسبتاً مستحکم ہو جاتی ہے۔ یہ ویولیٹ “ڈینوائزنگ” کا اثر ہے - قلیل مدتی، پرتشدد اتار چڑھاو کو ہموار کرتے ہوئے، آپ کو قیمت کا ایک ہموار رجحان دیکھنے کی اجازت دیتا ہے۔

Daubechies 4 (مختصر طور پر db4) انجینئرنگ میں سب سے زیادہ استعمال ہونے والے ویولیٹس میں سے ایک ہے۔ اس کے گتانک ہیں:[0.483, 0.837, 0.224, -0.129]نوٹ کریں کہ آخری گتانک ہے…منفی نمبریہی چیز اسے منفرد بناتی ہے۔
بنیادی کوڈ:
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 “قیمت جو ابھی واقع ہوئی ہے” پر زیادہ زور دیتا ہے، اور منفی وزن کے گتانک کا پہلے کی قیمت پر ایک “آفس سیٹنگ” اثر پڑے گا، جس سے ہمواری میں مزید اضافہ ہوگا۔

Symlet 4 Daubechies کا ایک بہتر ورژن ہے، جس کا مقصد بہتر توازن حاصل کرنا ہے۔ گتانک:[-0.076, -0.030, 0.498, 0.804, 0.298, -0.099, -0.013, 0.032]。
بنیادی کوڈ:
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都强,但反应速度更慢
اہم خصوصیات:8 موم بتیوں کی کھڑکی کی لمبائی قیمتوں کی لمبی “میموری” کی اجازت دیتی ہے۔ 8 موم بتیاں گزر جانے کے بعد تک ایک ہموار منحنی خطوط پر حقیقی رجحان کی تبدیلی نظر نہیں آسکتی ہے۔

Biorthogonal 3.3 (بائیور 3.3 کے طور پر مخفف) گتانکوں کے ساتھ ایک بالکل ہم آہنگ ویولیٹ ہے:[-0.066, 0.283, 0.637, 0.283, -0.066]。
بنیادی کوڈ:
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
اہم خصوصیات:ہم آہنگی اس بات کو یقینی بناتی ہے کہ کوئی “فیز ڈسٹورشن” نہیں ہے - ہموار وکر ناقابل فہم طور پر بائیں یا دائیں طرف نہیں جائے گا۔

میکسیکن ہیٹ (جسے ریکر ویولیٹ بھی کہا جاتا ہے) گتانک:[-0.1, 0.0, 0.4, 0.8, 0.4, 0.0, -0.1]اس کی شکل میکسیکن سومبریرو جیسی ہے۔
بنیادی کوڈ:
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
اہم خصوصیات:اس کا “درمیان میں بڑا، دونوں سروں پر منفی” ڈھانچہ اسے خاص طور پر پتہ لگانے میں اچھا بناتا ہے۔موڑ نقطہ- وہ نازک لمحہ جب قیمتیں اوپر کے رجحان سے نیچے کی طرف پلٹ جاتی ہیں (یا اس کے برعکس)۔ منفی وزن کا گتانک دور دراز کی قیمتوں کو “جرمانہ” دیتا ہے، رجحان کی تبدیلیوں کو تیزی سے پکڑتا ہے۔

مورلیٹ ویولیٹ ایک گاوسی (عام) تقسیم پر مبنی ہے، گتانک کے ساتھ:[0.0625, 0.25, 0.375, 0.25, 0.0625]。
بنیادی کوڈ:
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
اہم خصوصیات:تمام موجوں میں سب سے زیادہ “نرم”، اس کا کوئی منفی وزن نہیں ہے، اور تمام قیمتوں کو آہستہ سے حساب میں شامل کیا جاتا ہے۔ نتیجے میں آنے والا منحنی خطوط انتہائی ہموار ہے، لیکن لاگت کا ردعمل سست ہے – قیمت میں اچانک تبدیلیاں اس وقت تک ظاہر نہیں ہوسکتی ہیں جب تک کہ بعد میں کئی شمعیں نہ لگ جائیں۔

ڈسکریٹ میئر ویولیٹ سب سے پیچیدہ ویولیٹ ہے، جس میں گتانک ہیں:[-0.015, -0.025, 0.0, 0.28, 0.52, 0.28, 0.0, -0.025, -0.015]。
بنیادی کوڈ:
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% کی کمی ہوئی ہے، تب بھی اس کا منحنی خطوط “اضافہ جاری” دکھا سکتا ہے۔

ویولیٹس کی سات اقسام کا جائزہ لینے کے بعد، آپ کو ایک نمونہ نظر آنا چاہیے تھا:
مزید گتانک = مزید دیکھیں = مضبوط ہموار کرنا = زیادہ تاخیر
ہار (2 عدد) → صرف 1 بار کو دیکھیں → تقریباً ہموار نہیں۔ ڈوبیچیز 4 (4 ٹکڑے) → 3 سے پہلے دیکھیں → قدرے ہموار میکسیکن ہیٹ (7) → 6 سے پہلے دیکھیں → معتدل ہموار کرنا ڈسکریٹ میئر (9) → 8 بار دیکھنے سے پہلے → بھاری ہموار
منفی وزن کا اثر حساسیت کو بڑھانا اور تبدیلیوں کا پتہ لگانا آسان بنانا ہے۔
ہار/مورلیٹ (کوئی منفی وزن نہیں) → نرم اور ہموار، بے حس میکسیکن ہیٹ (دونوں سروں پر منفی) → انفلیکشن پوائنٹس کے لیے حساس Daubechies 4 (منفی) → رجحان کی تبدیلیوں کے لیے حساس
توازن کا کردار = کوئی مسخ نہیں = اصل شکل کو برقرار رکھنا
غیر متناسب (Daubechies) → بائیں/دائیں منتقل ہو سکتا ہے۔ ہم آہنگی (Biorthogonal/Meyer) → مرکزی پوزیشن کو برقرار رکھنا
ویولیٹ ٹرانسفارم کو بار بار لاگو کیا جا سکتا ہے، جیسے گھونسلے کی گڑیا۔ پہلی درخواست کو لیول 1 کہا جاتا ہے، اسے دوبارہ لیول 1 کے نتیجے میں لاگو کرنے کو لیول 2 کہا جاتا ہے، وغیرہ۔
مختلف سطحوں پر دیکھے جانے والے وقت کے پیمانے:
یہ فرض کرتے ہوئے کہ ہم BTC ٹریڈنگ کے لیے 1 گھنٹے کے کینڈل سٹک چارٹ استعمال کرتے ہیں:
سطح 1 → 2-4 گھنٹوں کے دوران قلیل مدتی اتار چڑھاو کا مشاہدہ کریں۔ سطح 2 → 4-8 گھنٹے کے دوران رجحان کا مشاہدہ کریں۔ سطح 3 → 1-2 دنوں میں درمیانی مدت کے رجحان کا مشاہدہ کریں (عام طور پر استعمال ہونے والی حکمت عملی) سطح 4 → 2-4 دن کی قیمت کی حد کا مشاہدہ کریں۔ سطح 5 → 4-8 دنوں میں اہم رجحانات کا مشاہدہ کریں۔
حقیقی نتائج کا موازنہ:
اصل BTC قیمت (1 گھنٹے کا چارٹ):99500, 99800, 99200, 100200, 99800, 100500, 100100, ...
لیول 1 پروسیسنگ: 99600, 99650, 99500, 99900, 99950, 100200, 100250, … (تھوڑا سا ہموار، لیکن اتار چڑھاو اب بھی نظر آتا ہے)
سطح 3 پروسیسنگ: 99620, 99650, 99700, 99800, 99950, 100100, 100200, … (ایک درمیانی مدت کے رجحان کی نشاندہی کرتے ہوئے ہموار کیا گیا)
لیول 5 پروسیسنگ: 99630, 99640, 99660, 99700, 99760, 99840, 99930, … (انتہائی ہموار، صرف عام سمت دکھا رہا ہے)

انتخاب کا اصول آسان ہے: اپنے انعقاد کی مدت کی بنیاد پر متعلقہ سطح کا استعمال کریں۔
15 منٹ کی اسکیلپنگ → لیول 1-2
انٹرا ڈے ٹریڈنگ → لیول 2-3
کچھ دن جھولے → لیول 3-4 کریں۔
طویل مدتی رجحان کا تجزیہ → لیول 4-5
ٹریڈنگ میں ویولیٹ ٹرانسفارم کا اطلاق بہت سیدھا ہوتا ہے: رجحان کی سمت کا تعین کرنے کے لیے اس سے پیدا ہونے والے ہموار قیمت کے وکر کا استعمال کریں، اور رجحان تبدیل ہونے پر تجارت کریں۔ خاص طور پر، اگر ہموار بند ہونے والی قیمت پچھلی قیمت سے زیادہ ہے، تو یہ اوپر کے رجحان کی نشاندہی کرتی ہے، اس لیے طویل سفر کریں۔ اگر ہموار بند ہونے والی قیمت پچھلی قیمت سے کم ہے، تو یہ نیچے کی طرف اشارہ کرتا ہے، اس لیے پوزیشن کو بند کریں یا مختصر کریں۔ یہ منطق موثر ہے کیونکہ لہروں نے شور کی وجہ سے غلط سگنل کے بجائے، حقیقی رجحان کی تبدیلی کے اعلی امکان کے طور پر “اوپر” یا “نیچے” کو چھوڑ کر مختصر مدت کے بے ترتیب اتار چڑھاؤ کو فلٹر کیا ہے۔
# 执行小波变换
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 '空仓'},无需操作")

یقینا، عملی طور پر، یہ اتنا آسان نہیں ہے. آپ ایک ساتھ متعدد لیولز کا استعمال کر سکتے ہیں، جیسے لیول 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
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()