Khi phân tích kỹ thuật trong giao dịch, các nhà giao dịch đều phân tích và nghiên cứu dữ liệu giá cổ phiếu như dữ liệu phân bố bình thường. Tuy nhiên, phân bố dữ liệu giá cổ phiếu không phù hợp với phân bố bình thường tiêu chuẩn.Fisher Transformation
Đây là một phương pháp để chuyển đổi dữ liệu giá thành thành một phân bố bình thường tương tự.Fisher Transformation
Đơn giản hóa dữ liệu thị trường, loại bỏ một số dao động chu kỳ nhỏ sắc nét. Sử dụng sự giao thoa của các chỉ số trong ngày và ngày trước đó để phát tín hiệu giao dịch.
VềFisher Transform
Những người tham gia vào cuộc họp này đã nói rằng họ không biết nhiều về vấn đề này.
Giá trung bình hôm nay:
mid=(low + high) / 2
Để xác định chu kỳ tính toán, bạn có thể sử dụng chu kỳ 10 ngày. Giá cao nhất và thấp nhất trong chu kỳ tính toán:
lowestLow = 周期内最低价
,highestHigh = 周期内最高价
。
Định nghĩa các tham số biến giá (( trong đóratio
Đối với các định số trong khoảng 0 - 1, ví dụ như 0.5 hoặc 0.33):
Các tham số thay đổi giáx
Sử dụngFisher
chuyển đổi, nhận đượcFisher
Chỉ số:
Theo thuật toán chỉ số này được thực hiện từng bước.preX
,preFish
Chúng tôi sẽ bắt đầu bằng 0 ≠ 0.Math.log
Và nếu bạn muốn tính toán con số này, bạn cần phải tính toán con số này bằng cách tính toán con số tự nhiên e.
Giá trị của x sửa đổi lớn hơn 0,99 buộc phải được đặt là 0,999; nhỏ hơn -0,99 đồng nghĩa.
if (x > 0.99) {
x = 0.999
} else if (x < -0.99) {
x = -0.999
}
Lần đầu tiên nhìn vào thuật toán, chỉ số, sau khi được chuyển theo thuật toán. Tôi cũng không xác minh thực hiện này, các đồng nghiệp quan tâm có thể kiểm tra xem có lỗi không.
Fisher Transform
Nguồn mã của thuật toán chỉ số:
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
}
Trong một bài viết đăng trên trang Facebook của mình, ông cho biết:https://www.fmz.com/square
Những ví dụ trên có thể được tham khảo hoặc tìm kiếm.
Giữa bài viết, mã kiểm tra hình ảnh dưới đây cần thêm thực hiện hàm calcFisher trên để chạy.
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
}
}
}
}
Vì vậy, nghiên cứu dữ liệu, biểu đồ, chiến lược thiết kế trên FMZ là rất thuận tiện. Bạn có thể tham gia vào chương trình này để tìm hiểu thêm về các vấn đề liên quan đến các giáo viên và học sinh.