ট্রেডিংয়ের প্রযুক্তিগত বিশ্লেষণের সময়, ব্যবসায়ীরা বিশ্লেষণ এবং অধ্যয়নের জন্য সাধারণভাবে বিতরণ করা ডেটা হিসাবে স্টক মূল্যের ডেটা গ্রহণ করে। তবে, স্টক মূল্যের ডেটা বিতরণ স্ট্যান্ডার্ড স্বাভাবিক বিতরণের সাথে সামঞ্জস্যপূর্ণ নয়।Fisher Transformation
এটি এমন একটি পদ্ধতি যা মূল্যের তথ্যকে স্বাভাবিক বন্টনের অনুরূপ কিছুতে রূপান্তর করতে পারে।Fisher Transformation
এটি বাজারের তথ্যকে মসৃণ করে এবং কিছু ধারালো ছোট পর্যায়ক্রমিক কম্পন দূর করে। আজকের এবং আগের দিনের সূচকগুলির আন্তঃসংযোগ ব্যবহার করে ট্রেডিং সিগন্যাল পাঠানো যেতে পারে।
অনেকগুলি উল্লেখ আছেFisher Transformation
বাইডু এবং জিহুতে, যা এখানে বিস্তারিতভাবে ব্যাখ্যা করা হবে না।
আজকের গড় মূল্য:
mid=(low + high) / 2
হিসাবের সময়কাল নিশ্চিত করুন; আপনি একটি সময়কাল 10 দিন ব্যবহার করতে পারেন। সময়ের সর্বোচ্চ মূল্য এবং সর্বনিম্ন মূল্য গণনা করুনঃ
lowestLow = the lowest price in the period
,highestHigh = the highest price in the period
.
মূল্য পরিবর্তনের পরামিতি নির্ধারণ করুন (যার মধ্যেratio
একটি ধ্রুবক 0 থেকে 1; উদাহরণস্বরূপ, আপনি 0.5 বা 0.33 চয়ন করতে পারেন):(
প্রয়োগ করুনFisher
মূল্য পরিবর্তনের পরামিতিতে রূপান্তরx
, এবংFisher
সূচক পাওয়া যাবেঃ
সূচক অ্যালগরিদম অনুযায়ী, ধাপে ধাপে এটি বাস্তবায়ন. এটা লক্ষ করা উচিত যে এই অ্যালগরিদম একটি পুনরাবৃত্তি অ্যালগরিদম, এবং জন্যpreX
, preFish
, তারা প্রাথমিকভাবে 0 এ সেট করা হয়।Math.log
প্রাকৃতিক ধ্রুবক e এর উপর ভিত্তি করে লোগারিদম। উপরন্তু, x এর সংশোধন উপরের অ্যালগরিদমের মধ্যে উল্লেখ করা হয় না, এবং আমি লেখার সময় এই সমস্যাটি প্রায় উপেক্ষা করেছিঃ
এক্স এর মান পরিবর্তন করুন; যদি মানটি 0.99 এর বেশি হয় তবে জোর করে 0.999; যদি এটি -0.99 এর চেয়ে কম হয় তবে -0.999 এ সেট করুন।
if (x > 0.99) {
x = 0.999
} else if (x < -0.99) {
x = -0.999
}
এই প্রথম আমি অ্যালগরিদম এবং সূচকটি দেখছি, অ্যালগরিদম অনুযায়ী এটি পোর্টিং করার পরে। আমি বাস্তবায়নটি যাচাই করিনি, এবং গবেষণা আগ্রহী শিক্ষার্থীরা কোনও ত্রুটি আছে কিনা তা যাচাই করতে পারে। ত্রুটি থাকলে তা নির্দেশ করার জন্য অনেক ধন্যবাদ।
সোর্স কোডFisher Transform
সূচক অ্যালগরিদমঃ
function getHighest(arr, period) {
if (arr.length == 0 || arr.length - period < 0) {
return null
}
var beginIndex = arr.length - period
var ret = arr[beginIndex].High
for (var i = 0 ; i < arr.length - 1 ; i++) {
if (arr[i + 1].High > ret) {
ret = arr[i + 1].High
}
}
return ret
}
function getLowest(arr, period) {
if (arr.length == 0 || arr.length - period < 0) {
return null
}
var beginIndex = arr.length - period
var ret = arr[beginIndex].Low
for (var i = 0 ; i < arr.length - 1 ; i++) {
if (arr[i + 1].Low < ret) {
ret = arr[i + 1].Low
}
}
return ret
}
function calcFisher(records, ratio, period) {
var preFish = 0
var preX = 0
var arrFish = []
// when the K-line length is not long enough to meet the K-line period
if (records.length < period) {
for (var i = 0 ; i < records.length ; i++) {
arrFish.push(0)
}
return arrFish
}
// traverse K-lines
for (var i = 0 ; i < records.length ; i++) {
var fish = 0
var x = 0
var bar = records[i]
var mid = (bar.High + bar.Low) / 2
// when the current BAR is not enough for period to calculate
if (i < period - 1) {
fish = 0
preFish = 0
arrFish.push(fish)
continue
}
// calculate the highest price and the lowest price in the period
var bars = []
for (var j = 0 ; j <= i ; j++) {
bars.push(records[j])
}
var lowestLow = getLowest(bars, period)
var highestHigh = getHighest(bars, period)
// price change parameter x
x = ratio * 2 * ((mid - lowestLow) / (highestHigh - lowestLow) - 0.5) + (1 - ratio) * preX
if (x > 0.99) {
x = 0.999
} else if (x < -0.99) {
x = -0.999
}
preX = x
fish = 0.5 * Math.log((1 + x) / (1 - x)) + 0.5 * preFish
preFish = fish
arrFish.push(fish)
}
return arrFish
}
এফএমজেডের উপর প্লট করা খুব সহজ; আপনি কৌশল স্কোয়ারে অনেক উদাহরণ উল্লেখ করতে পারেনঃhttps://www.fmz.com/square
, এবং আপনি আপনার প্রয়োজনীয় কৌশলগুলিও অনুসন্ধান করতে পারেন।
var cfg = { // used to initially configure the chart objects (namely chart settings)
plotOptions: {
candlestick: {
color: '#d75442', // color value
upColor: '#6ba583' // color vlaue
}
},
title: { text: 'Fisher Transform'}, //title
subtitle: {text: ''}, //subtitle
plotOptions: {
candlestick: {
tooltip: {
pointFormat:
'<span style="color:{point.color}">\u25CF</span> <b> {series.name}</b><br/>' +
'open: {point.open}<br/>' +
'highest: {point.high}<br/>' +
'lowest: {point.low}<br/>' +
'close: {point.close}<br/>'
}
}
},
yAxis: [{
title: {
text: 'K-line market quote'
},
height: '70%',
lineWidth: 1
}, {
title: {
text: 'Fisher Transform'
},
top: '75%',
height: '30%',
offset: 0,
lineWidth: 1
}],
series: [//series
{
type: 'candlestick',
yAxis: 0,
name: 'K-line',
id: 'KLine',
// control the candlestick color of fall
color: 'green',
lineColor: 'green',
// control the candlestick color of rise
upColor: 'red',
upLineColor: 'red',
data: []
},{
type: 'line', // set the type of the current data series as: line
yAxis: 1, // the y axis for use is the y axis with index 0 (in highcharts, there can be multiple y axis, and here it indicates the y axis with index 0)
showInLegend: true, //
name: 'fish', // set according the parameter label passed by the function
lineWidth: 1,
data: [], // data item of the data series
tooltip: { // tip for tool
valueDecimals: 2 // the decimals of the value reserve 5
}
},{
type: 'line', // set the type of the current data series as: line
yAxis: 1, // the y axis for use is the y axis with index 0 (in highcharts, there can be multiple y axis, and here it indicates the y axis with index 0)
showInLegend: true, //
name: 'preFish', // set according the parameter label passed by the function
lineWidth: 1,
data: [], // data item of the data series
tooltip: { // tip for tool
valueDecimals: 2 // the decimals of the value reserve 5
}
}
]
}
var chart = Chart(cfg)
function main() {
var ts = 0
chart.reset()
while (true) {
var r = exchange.GetRecords()
var fisher = calcFisher(r, 0.33, 10)
if (!r || !fisher) {
Sleep(500)
continue
}
for (var i = 0; i < r.length; i++){
if (ts == r[i].Time) {
chart.add([0,[r[i].Time, r[i].Open, r[i].High, r[i].Low, r[i].Close], -1])
chart.add([1,[r[i].Time, fisher[i]], -1])
if (i - 1 >= 0) {
chart.add([2,[r[i].Time, fisher[i - 1]], -1])
}
}else if (ts < r[i].Time) {
chart.add([0,[r[i].Time, r[i].Open, r[i].High, r[i].Low, r[i].Close]])
chart.add([1,[r[i].Time, fisher[i]]])
if (i - 1 >= 0) {
chart.add([2,[r[i].Time, fisher[i - 1]]])
}
ts = r[i].Time
}
}
}
}
তাই এফএমজেডে ডেটা, চার্ট প্রদর্শন এবং কৌশল নকশা অধ্যয়ন করা খুবই সুবিধাজনক। এখানে আমি আরও ধারণার জন্য আলোচনা শুরু করছি, তাই শিক্ষক এবং শিক্ষার্থীদের এখানে মন্তব্য করার জন্য স্বাগত জানাই।