거래의 기술적 분석을 할 때, 거래자는 주식 가격 데이터를 정규 분포의 데이터로 분석, 연구한다. 그러나, 주식 가격 데이터 분포는 표준 정규 분포에 맞지 않는다.Fisher Transformation
이것은 가격 데이터를 정규 분포와 유사한 것으로 변환하는 방법입니다.Fisher Transformation
시장 데이터를 부드럽게하고, 일부 날카로운 소주기 변동을 제거합니다. 하루와 전날의 지표의 교차를 활용하여 거래 신호를 발송할 수 있습니다.
에 대해Fisher Transform
이 글은 유튜브에서 공개된 글입니다.
오늘 중간 가격:
mid=(low + high) / 2
계산 주기를 정의하기 위해 10 일 주기를 사용할 수 있습니다. 계산 주기의 최고 가격과 최저 가격:
lowestLow = 周期内最低价
,highestHigh = 周期内最高价
。
정의된 가격 변수 파라미터 (이 중)ratio
0 - 1 사이의 상수, 예를 들어 0.5 또는 0.33가 선택됩니다.)
가격변화 매개 변수x
사용Fisher
변함, 얻습니다Fisher
지표:
이 지표 알고리즘에 따라 점진적으로 구현됩니다. 이 알고리즘은 반복 알고리즘이며,preX
,preFish
0와 같다는 것을 알 수 있습니다.Math.log
자연수 e를 기본으로 하는 로그램입니다. 또한 위의 알고리즘에서 언급되지 않은 x에 대한 수정, 저는 이 문제를 작성할 때 거의 무시했습니다:
수정된 x의 값은 0.99보다 크면 0.999로 강제 설정된다. -0.99보다 작다는 동음이 된다.
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 = []
// 当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
}
이 사진은 이 사진의 사진입니다. 이 사진은 이 사진입니다.https://www.fmz.com/square
위의 많은 예들은 참고할 수도 있고 검색할 수도 있습니다.
중간 부분에서, 다음 도표 테스트 코드에 위의 calcFisher 함수 구현을 추가해야 실행될 수 있다.
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
}
}
}
}
그래서 FMZ에서 데이터, 그래픽 표시, 디자인 전략을 연구하는 것은 매우 편리합니다. 이 문서는 교사와 학생들의 글을 환영합니다.