
Ketika melakukan analisis teknis dalam perdagangan, pedagang menganalisis dan mempelajari data harga saham sebagai data yang terdistribusi normal. Namun, distribusi data harga saham tidak sesuai dengan distribusi normal standar.Fisher TransformationIni adalah metode yang dapat mengubah data harga menjadi distribusi normal.Fisher TransformationMemperhalus data pasar dan menghilangkan beberapa osilasi siklus kecil yang tajam. Sinyal perdagangan dapat dihasilkan dengan menggunakan persilangan indikator untuk hari ini dan hari sebelumnya.
tentangFisher TransformAda banyak informasi tentang Baidu dan Zhihu, jadi saya tidak akan membahas detailnya di sini.
mid=(low + high) / 2
lowestLow = 周期内最低价,highestHigh = 周期内最高价。
ratioadalah konstanta antara 0 dan 1, misalnya 0,5 atau 0,33):
xmenggunakanFisherTransformasi, dapatkanFisherindeks:
Terapkan langkah demi langkah sesuai dengan algoritma indikator. Perlu dicatat bahwa algoritma ini adalah algoritma iteratif.preX,preFishAwalnya ditetapkan ke 0. untukMath.logYaitu mencari logaritma dengan konstanta alami e sebagai basis. Selain itu, algoritma di atas tidak menyebutkan koreksi x, dan saya hampir mengabaikan masalah ini saat menulisnya:
Perbaiki nilai x. Jika lebih besar dari 0,99, maka akan dipaksa menjadi 0,999. Hal yang sama berlaku jika kurang dari -0,99.
if (x > 0.99) {
x = 0.999
} else if (x < -0.99) {
x = -0.999
}
Pertama kali saya melihat algoritma dan indikator ini, saya memindahkannya sesuai dengan algoritma tersebut. Saya belum memverifikasi implementasi ini. Mahasiswa yang tertarik dalam penelitian dapat memverifikasi apakah ada kesalahan. Terima kasih banyak telah menunjukkan kesalahannya.
Fisher TransformKode sumber algoritma indikator:
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 = []
// 当K线长度不足,不满足周期时
if (records.length < period) {
for (var i = 0 ; i < records.length ; i++) {
arrFish.push(0)
}
return arrFish
}
// 遍历K线
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
// 当前BAR不足period计算时
if (i < period - 1) {
fish = 0
preFish = 0
arrFish.push(fish)
continue
}
// 计算周期内最高价和最低价
var bars = []
for (var j = 0 ; j <= i ; j++) {
bars.push(records[j])
}
var lowestLow = getLowest(bars, period)
var highestHigh = getHighest(bars, period)
// 价变参数
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
}
Menggambar di FMZ sangat sederhana, Strategy Square:https://www.fmz.com/squareAda banyak contoh di atas untuk referensi atau pencarian.
Karena panjangnya artikel ini, kode uji gambar berikut perlu menambahkan implementasi fungsi calcFisher di atas sebelum dapat dijalankan.
var cfg = { // 用来初始化设置图表的对象(即图表设置)
plotOptions: {
candlestick: {
color: '#d75442', // 颜色值
upColor: '#6ba583' // 颜色值
}
},
title: { text: 'Fisher Transform'}, //标题
subtitle: {text: ''}, //副标题
plotOptions: {
candlestick: {
tooltip: {
pointFormat:
'<span style="color:{point.color}">\u25CF</span> <b> {series.name}</b><br/>' +
'开盘: {point.open}<br/>' +
'最高: {point.high}<br/>' +
'最低: {point.low}<br/>' +
'收盘: {point.close}<br/>'
}
}
},
yAxis: [{
title: {
text: 'K线行情'
},
height: '70%',
lineWidth: 1
}, {
title: {
text: 'Fisher Transform'
},
top: '75%',
height: '30%',
offset: 0,
lineWidth: 1
}],
series: [//系列
{
type: 'candlestick',
yAxis: 0,
name: 'K线',
id: 'KLine',
// 控制走势为跌的蜡烛颜色
color: 'green',
lineColor: 'green',
// 控制走势为涨的蜡烛颜色
upColor: 'red',
upLineColor: 'red',
data: []
},{
type: 'line', // 设置当前的数据序列 类型为: 线
yAxis: 1, // 使用的y轴 为索引为 0 的y轴(highcharts 图表 可以有 多个 y 坐标轴,这里指定索引0的y轴)
showInLegend: true, //
name: 'fish', // 根据 函数传入的 参数 label 设置
lineWidth: 1,
data: [], // 数据序列的数据项
tooltip: { // 工具提示
valueDecimals: 2 // 值的小数点 保留5位
}
},{
type: 'line', // 设置当前的数据序列 类型为: 线
yAxis: 1, // 使用的y轴 为索引为 0 的y轴(highcharts 图表 可以有 多个 y 坐标轴,这里指定索引0的y轴)
showInLegend: true, //
name: 'preFish', // 根据 函数传入的 参数 label 设置
lineWidth: 1,
data: [], // 数据序列的数据项
tooltip: { // 工具提示
valueDecimals: 2 // 值的小数点 保留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
}
}
}
}

Oleh karena itu, sangat mudah untuk mempelajari data, menampilkan grafik, dan merancang strategi di FMZ. Ini hanyalah titik awal, dan guru serta siswa dipersilakan untuk meninggalkan komentar.