Apabila analisis teknikal dalam perdagangan, peniaga menggunakan data harga saham sebagai data pembahagian normal untuk analisis dan kajian. Walau bagaimanapun, pembahagian data harga saham tidak sesuai dengan pembahagian normal standard.Fisher Transformation
Ini adalah satu kaedah untuk menukar data harga kepada pembahagian yang serupa dengan normal.Fisher Transformation
Menghapuskan beberapa pergerakan kitaran kecil yang tajam. Menggunakan pengalihan indikator hari itu dan hari sebelumnya untuk menghantar isyarat dagangan.
MengenaiFisher Transform
Di sini, saya tidak akan membincangkan lebih lanjut mengenai maklumat mengenai Baidoa.
Harga purata hari ini:
mid=(low + high) / 2
Untuk menentukan kitaran pengiraan, anda boleh menggunakan kitaran 10 hari. Harga tertinggi dan harga minimum dalam kitaran pengiraan:
lowestLow = 周期内最低价
,highestHigh = 周期内最高价
。
Parameter pembolehubah harga (dalam manaratio
Untuk bilangan malar antara 0 - 1, contohnya 0.5 atau 0.33):
Parameter perubahan hargax
PenggunaanFisher
Mengubah, mendapatFisher
Indikator:
Menurut algoritma penunjuk ini, ia akan dilaksanakan secara beransur-ansur. Perlu diingat bahawa algoritma ini adalah algoritma iterasi, untukpreX
,preFish
Semua permulaan ditetapkan sebagai 0 ≠ 0.Math.log
Ini adalah logaritma yang mempunyai asas e. Selain itu, penyesuaian untuk x tidak disebutkan dalam algoritma di atas, dan saya hampir mengabaikan masalah ini semasa menulis:
Nilai x yang diperbetulkan, lebih besar daripada 0.99 terpaksa ditetapkan sebagai 0.999; kurang daripada -0.99 adalah sama.
if (x > 0.99) {
x = 0.999
} else if (x < -0.99) {
x = -0.999
}
Pertama kali melihat algoritma ini, penunjuk, selepas ia dipindahkan mengikut algoritma. Implementasi ini juga tidak saya periksa, rakan sekerja yang berminat boleh mengesahkan sama ada terdapat kesilapan. Terima kasih banyak untuk menunjukkan kesilapan.
Fisher Transform
Kod sumber algoritma penunjuk:
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, gambar adalah mudah, Strategy Square:https://www.fmz.com/square
Terdapat banyak contoh di atas yang boleh dirujuk atau dicari.
Antara bahagian, kod ujian gambar di bawah memerlukan pelaksanaan 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
}
}
}
}
Oleh itu, ia sangat mudah untuk mengkaji data, imej, dan strategi reka bentuk di FMZ. Di sini anda boleh melampirkan tanda tangan dan mengalu-alukan guru dan rakan-rakan anda.