Ketika melakukan analisis teknis dalam transaksi, para pedagang menggunakan data harga saham sebagai data distribusi normal untuk analisis dan penelitian. Namun, distribusi data harga saham tidak sesuai dengan distribusi normal standar.Fisher Transformation
Ini adalah metode untuk mengubah data harga ke dalam distribusi normal yang mirip.Fisher Transformation
Menghaluskan data pasar dan menghilangkan beberapa osilasi siklus kecil yang tajam. Menggunakan pergantian indikator hari itu dan hari sebelumnya dapat mengirimkan sinyal perdagangan.
TentangFisher Transform
Di sini, saya tidak akan membahas lebih lanjut tentang apa yang saya ketahui.
Harga rata-rata hari ini:
mid=(low + high) / 2
Untuk menentukan siklus perhitungan, Anda dapat menggunakan 10 hari sebagai siklus. Harga tertinggi dan terendah dalam siklus perhitungan:
lowestLow = 周期内最低价
,highestHigh = 周期内最高价
。
Parameter variabel harga (di manaratio
Untuk konstanta antara 0 - 1, misalnya 0.5 atau 0.33):
Parameter perubahan hargax
PenggunaanFisher
Transformasi, mendapatkanFisher
Indikator:
Ini adalah algoritma iterasi yang digunakan untuk mengevaluasi nilai-nilai dari suatu algoritma.preX
,preFish
Pada awalnya, semuanya ditetapkan sebagai 0 ≠ 0.Math.log
Jadi, jika kita menggunakan rumus ini, kita akan menemukan bahwa x adalah bilangan bulat yang memiliki dasar e. Selain itu, tidak ada perbaikan pada x yang disebutkan dalam algoritma di atas, dan saya hampir mengabaikan masalah ini saat menulis:
Nilai x yang diperbaiki, lebih besar dari 0,99 harus disetel menjadi 0,999; kurang dari -0,99 adalah analog.
if (x > 0.99) {
x = 0.999
} else if (x < -0.99) {
x = -0.999
}
Pertama kali melihat algoritma ini, indikator, setelah ditransport sesuai dengan algoritma. Implementasi ini juga belum saya verifikasi, rekan-rekan yang tertarik dapat memverifikasi apakah tidak ada kesalahan. Terima kasih banyak untuk menunjukkan kesalahan.
Fisher Transform
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
}
Di FMZ, gambarnya sangat sederhana, Strategy Square:https://www.fmz.com/square
Contoh-contoh di atas banyak yang dapat Anda lihat atau cari.
Di tengah-tengah artikel, kode pengujian gambar di bawah ini membutuhkan implementasi fungsi calcFisher yang ditambahkan di atas untuk berjalan.
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
}
}
}
}
Jadi sangat mudah untuk mempelajari data, tampilan grafis, dan strategi desain di FMZ. Di sini Anda dapat menanamkan bunga, menyambut guru dan teman-teman sekelas.