@ch20026103/anysis 0.0.12-alpha → 0.0.13-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/analyze/Slope/index.js +0 -1
- package/dist/cjs/analyze/Slope/slope.test.js +10 -0
- package/dist/cjs/analyze/SwingExtremes/index.d.ts +9 -0
- package/dist/cjs/analyze/SwingExtremes/index.js +66 -0
- package/dist/cjs/analyze/SwingExtremes/index.test.d.ts +1 -0
- package/dist/cjs/analyze/SwingExtremes/index.test.js +26 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +12 -7
- package/dist/cjs/stockSkills/boll.d.ts +1 -0
- package/dist/cjs/stockSkills/boll.js +0 -1
- package/dist/esm/analyze/Slope/index.js +0 -1
- package/dist/esm/analyze/Slope/slope.test.js +10 -0
- package/dist/esm/analyze/SwingExtremes/index.d.ts +9 -0
- package/dist/esm/analyze/SwingExtremes/index.js +60 -0
- package/dist/esm/analyze/SwingExtremes/index.test.d.ts +1 -0
- package/dist/esm/analyze/SwingExtremes/index.test.js +24 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/stockSkills/boll.d.ts +1 -0
- package/dist/esm/stockSkills/boll.js +0 -1
- package/dist/umd/index.js +64 -2
- package/package.json +15 -17
|
@@ -5,7 +5,6 @@ function Slope(y) {
|
|
|
5
5
|
// 計算 x 和 y 的平均值
|
|
6
6
|
var y_mean = y.reduce(function (acc, cur) { return acc + cur; }) / y.length;
|
|
7
7
|
var increment = (0, calculateDivisionFactor_1.default)(y_mean);
|
|
8
|
-
console.log(y_mean, increment);
|
|
9
8
|
var x = Array.from({ length: y.length }, function (_, index) { return index * increment; });
|
|
10
9
|
var x_mean = x.reduce(function (acc, cur) { return acc + cur; }) / x.length;
|
|
11
10
|
// 計算斜率
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var simpleRegressoinModel_1 = require("../Regression/simpleRegressoinModel");
|
|
3
4
|
var index_1 = require("./index");
|
|
4
5
|
describe("test Slope methods", function () {
|
|
5
6
|
it("test 123456", function () {
|
|
@@ -27,4 +28,13 @@ describe("test Slope methods", function () {
|
|
|
27
28
|
var slope = (0, index_1.default)(y);
|
|
28
29
|
expect(slope).toEqual(2.142857142857143);
|
|
29
30
|
});
|
|
31
|
+
it("test simple regression", function () {
|
|
32
|
+
var y = [50, 30, 10, 60, 70, 40, 100];
|
|
33
|
+
var x = Array.from({ length: y.length }, function (_, index) { return index; });
|
|
34
|
+
var res = (0, simpleRegressoinModel_1.default)(x, y);
|
|
35
|
+
var new_y = x.map(function (y) { return res.predictModel(y); });
|
|
36
|
+
expect(res.description).toEqual("Y=26.785714285714292+8.214285714285714X");
|
|
37
|
+
var slope = (0, index_1.default)(new_y);
|
|
38
|
+
expect(slope).toEqual(0.8214285714285714);
|
|
39
|
+
});
|
|
30
40
|
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare enum SwingExtremesType {
|
|
2
|
+
Peak = "Peak",
|
|
3
|
+
Trough = "Trough"
|
|
4
|
+
}
|
|
5
|
+
type Index = number;
|
|
6
|
+
export declare function findPeaksByGradient(prices: number[]): Index[];
|
|
7
|
+
export declare function findTroughByGradient(prices: number[]): Index[];
|
|
8
|
+
export declare function SwingExtremes(y: number[], type: SwingExtremesType): Index[];
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SwingExtremes = exports.findTroughByGradient = exports.findPeaksByGradient = exports.SwingExtremesType = void 0;
|
|
4
|
+
var SwingExtremesType;
|
|
5
|
+
(function (SwingExtremesType) {
|
|
6
|
+
SwingExtremesType["Peak"] = "Peak";
|
|
7
|
+
SwingExtremesType["Trough"] = "Trough";
|
|
8
|
+
})(SwingExtremesType = exports.SwingExtremesType || (exports.SwingExtremesType = {}));
|
|
9
|
+
function findPeaksByGradient(prices) {
|
|
10
|
+
var peaks = [];
|
|
11
|
+
for (var i = 1; i < prices.length - 1; i++) {
|
|
12
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
13
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
14
|
+
if (prevGradient > 0 && nextGradient < 0) {
|
|
15
|
+
peaks.push(i);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return peaks;
|
|
19
|
+
}
|
|
20
|
+
exports.findPeaksByGradient = findPeaksByGradient;
|
|
21
|
+
function findTroughByGradient(prices) {
|
|
22
|
+
var peaks = [];
|
|
23
|
+
for (var i = 1; i < prices.length - 1; i++) {
|
|
24
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
25
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
26
|
+
if (prevGradient < 0 && nextGradient > 0) {
|
|
27
|
+
peaks.push(i);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return peaks;
|
|
31
|
+
}
|
|
32
|
+
exports.findTroughByGradient = findTroughByGradient;
|
|
33
|
+
function SwingExtremes(y, type) {
|
|
34
|
+
if (type === SwingExtremesType.Peak) {
|
|
35
|
+
var result = [];
|
|
36
|
+
var indexs = findPeaksByGradient(y);
|
|
37
|
+
result.push(indexs[0]);
|
|
38
|
+
for (var i = 1; i < indexs.length; i++) {
|
|
39
|
+
if (y[indexs[i]] > y[result[result.length - 1]]) {
|
|
40
|
+
result[result.length - 1] = indexs[i];
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
result.push(indexs[i]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
if (type === SwingExtremesType.Trough) {
|
|
49
|
+
var result = [];
|
|
50
|
+
var indexs = findTroughByGradient(y);
|
|
51
|
+
result.push(indexs[0]);
|
|
52
|
+
for (var i = 1; i < indexs.length; i++) {
|
|
53
|
+
if (y[indexs[i]] < y[result[result.length - 1]]) {
|
|
54
|
+
result[result.length - 1] = indexs[i];
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
result.push(indexs[i]);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
throw new Error("Invalid SwingExtremesType");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.SwingExtremes = SwingExtremes;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var index_1 = require("./index");
|
|
4
|
+
describe("test SwingExtremes", function () {
|
|
5
|
+
var prices;
|
|
6
|
+
beforeEach(function () {
|
|
7
|
+
prices = [10, 12, 11, 13, 15, 14, 16, 10, 8, 9, 11, 7, 5, 8, 4, 5];
|
|
8
|
+
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15
|
|
9
|
+
});
|
|
10
|
+
it("test findPeaksByGradient", function () {
|
|
11
|
+
var res = (0, index_1.findPeaksByGradient)(prices);
|
|
12
|
+
expect(res).toEqual([1, 4, 6, 10, 13]);
|
|
13
|
+
});
|
|
14
|
+
it("test findTroughByGradient", function () {
|
|
15
|
+
var res = (0, index_1.findTroughByGradient)(prices);
|
|
16
|
+
expect(res).toEqual([2, 5, 8, 12, 14]);
|
|
17
|
+
});
|
|
18
|
+
it("test SwingExtremes Peak", function () {
|
|
19
|
+
var res = (0, index_1.SwingExtremes)(prices, index_1.SwingExtremesType.Peak);
|
|
20
|
+
expect(res).toEqual([6, 10, 13]);
|
|
21
|
+
});
|
|
22
|
+
it("test SwingExtremes Trough", function () {
|
|
23
|
+
var res = (0, index_1.SwingExtremes)(prices, index_1.SwingExtremesType.Trough);
|
|
24
|
+
expect(res).toEqual([2, 14]);
|
|
25
|
+
});
|
|
26
|
+
});
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { default as Angle } from "./analyze/Angle/index.js";
|
|
2
2
|
export { default as simpleRegressionModel } from "./analyze/Regression/simpleRegressoinModel.js";
|
|
3
3
|
export { default as slope } from "./analyze/Slope/index.js";
|
|
4
|
+
export { SwingExtremes, findPeaksByGradient, findTroughByGradient, SwingExtremesType, } from "./analyze/SwingExtremes/index.js";
|
|
4
5
|
export { exponentialSmoothing, movingAverages, weightMovingAverages, } from "./analyze/TimeSeries/R/index.js";
|
|
5
6
|
export { calcSeasonalIndicesNoTrend } from "./analyze/TimeSeries/RS/index.js";
|
|
6
7
|
export { default as Boll } from "./stockSkills/boll.js";
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseLsusbOutput = exports.isJSON = exports.calculateDivisionFactor = exports.minus = exports.add = exports.Williams = exports.Vma = exports.getWeekLine = exports.dateFormat = exports.Rsi = exports.Obv = exports.Macd = exports.Ma = exports.Kd = exports.Gold = exports.Ema = exports.Boll = exports.calcSeasonalIndicesNoTrend = exports.weightMovingAverages = exports.movingAverages = exports.exponentialSmoothing = exports.slope = exports.simpleRegressionModel = exports.Angle = void 0;
|
|
3
|
+
exports.parseLsusbOutput = exports.isJSON = exports.calculateDivisionFactor = exports.minus = exports.add = exports.Williams = exports.Vma = exports.getWeekLine = exports.dateFormat = exports.Rsi = exports.Obv = exports.Macd = exports.Ma = exports.Kd = exports.Gold = exports.Ema = exports.Boll = exports.calcSeasonalIndicesNoTrend = exports.weightMovingAverages = exports.movingAverages = exports.exponentialSmoothing = exports.SwingExtremesType = exports.findTroughByGradient = exports.findPeaksByGradient = exports.SwingExtremes = exports.slope = exports.simpleRegressionModel = exports.Angle = void 0;
|
|
4
4
|
/*
|
|
5
5
|
請注意,在 src/index.ts 中,我的導入包含文件擴展名(.js)。
|
|
6
6
|
如果需要支持 Node.js 和構建工具(ex: webpack),則不需要這樣做。 **因為commonJs默認js副檔名**
|
|
@@ -12,12 +12,17 @@ var simpleRegressoinModel_js_1 = require("./analyze/Regression/simpleRegressoinM
|
|
|
12
12
|
Object.defineProperty(exports, "simpleRegressionModel", { enumerable: true, get: function () { return simpleRegressoinModel_js_1.default; } });
|
|
13
13
|
var index_js_2 = require("./analyze/Slope/index.js");
|
|
14
14
|
Object.defineProperty(exports, "slope", { enumerable: true, get: function () { return index_js_2.default; } });
|
|
15
|
-
var index_js_3 = require("./analyze/
|
|
16
|
-
Object.defineProperty(exports, "
|
|
17
|
-
Object.defineProperty(exports, "
|
|
18
|
-
Object.defineProperty(exports, "
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
var index_js_3 = require("./analyze/SwingExtremes/index.js");
|
|
16
|
+
Object.defineProperty(exports, "SwingExtremes", { enumerable: true, get: function () { return index_js_3.SwingExtremes; } });
|
|
17
|
+
Object.defineProperty(exports, "findPeaksByGradient", { enumerable: true, get: function () { return index_js_3.findPeaksByGradient; } });
|
|
18
|
+
Object.defineProperty(exports, "findTroughByGradient", { enumerable: true, get: function () { return index_js_3.findTroughByGradient; } });
|
|
19
|
+
Object.defineProperty(exports, "SwingExtremesType", { enumerable: true, get: function () { return index_js_3.SwingExtremesType; } });
|
|
20
|
+
var index_js_4 = require("./analyze/TimeSeries/R/index.js");
|
|
21
|
+
Object.defineProperty(exports, "exponentialSmoothing", { enumerable: true, get: function () { return index_js_4.exponentialSmoothing; } });
|
|
22
|
+
Object.defineProperty(exports, "movingAverages", { enumerable: true, get: function () { return index_js_4.movingAverages; } });
|
|
23
|
+
Object.defineProperty(exports, "weightMovingAverages", { enumerable: true, get: function () { return index_js_4.weightMovingAverages; } });
|
|
24
|
+
var index_js_5 = require("./analyze/TimeSeries/RS/index.js");
|
|
25
|
+
Object.defineProperty(exports, "calcSeasonalIndicesNoTrend", { enumerable: true, get: function () { return index_js_5.calcSeasonalIndicesNoTrend; } });
|
|
21
26
|
var boll_js_1 = require("./stockSkills/boll.js");
|
|
22
27
|
Object.defineProperty(exports, "Boll", { enumerable: true, get: function () { return boll_js_1.default; } });
|
|
23
28
|
var ema_js_1 = require("./stockSkills/ema.js");
|
|
@@ -76,7 +76,6 @@ var Boll = /** @class */ (function () {
|
|
|
76
76
|
var sumMa = list
|
|
77
77
|
.slice(i - (type - 1), i + 1)
|
|
78
78
|
.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
79
|
-
console.log("sumMa", sumMa);
|
|
80
79
|
var bollMa_2 = Math.round((sumMa / type) * 100) / 100;
|
|
81
80
|
// 標準差
|
|
82
81
|
var difference = res
|
|
@@ -3,7 +3,6 @@ export default function Slope(y) {
|
|
|
3
3
|
// 計算 x 和 y 的平均值
|
|
4
4
|
var y_mean = y.reduce(function (acc, cur) { return acc + cur; }) / y.length;
|
|
5
5
|
var increment = calculateDivisionFactor(y_mean);
|
|
6
|
-
console.log(y_mean, increment);
|
|
7
6
|
var x = Array.from({ length: y.length }, function (_, index) { return index * increment; });
|
|
8
7
|
var x_mean = x.reduce(function (acc, cur) { return acc + cur; }) / x.length;
|
|
9
8
|
// 計算斜率
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import simpleRegressoinModel from "../Regression/simpleRegressoinModel";
|
|
1
2
|
import Slope from "./index";
|
|
2
3
|
describe("test Slope methods", function () {
|
|
3
4
|
it("test 123456", function () {
|
|
@@ -25,4 +26,13 @@ describe("test Slope methods", function () {
|
|
|
25
26
|
var slope = Slope(y);
|
|
26
27
|
expect(slope).toEqual(2.142857142857143);
|
|
27
28
|
});
|
|
29
|
+
it("test simple regression", function () {
|
|
30
|
+
var y = [50, 30, 10, 60, 70, 40, 100];
|
|
31
|
+
var x = Array.from({ length: y.length }, function (_, index) { return index; });
|
|
32
|
+
var res = simpleRegressoinModel(x, y);
|
|
33
|
+
var new_y = x.map(function (y) { return res.predictModel(y); });
|
|
34
|
+
expect(res.description).toEqual("Y=26.785714285714292+8.214285714285714X");
|
|
35
|
+
var slope = Slope(new_y);
|
|
36
|
+
expect(slope).toEqual(0.8214285714285714);
|
|
37
|
+
});
|
|
28
38
|
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare enum SwingExtremesType {
|
|
2
|
+
Peak = "Peak",
|
|
3
|
+
Trough = "Trough"
|
|
4
|
+
}
|
|
5
|
+
type Index = number;
|
|
6
|
+
export declare function findPeaksByGradient(prices: number[]): Index[];
|
|
7
|
+
export declare function findTroughByGradient(prices: number[]): Index[];
|
|
8
|
+
export declare function SwingExtremes(y: number[], type: SwingExtremesType): Index[];
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export var SwingExtremesType;
|
|
2
|
+
(function (SwingExtremesType) {
|
|
3
|
+
SwingExtremesType["Peak"] = "Peak";
|
|
4
|
+
SwingExtremesType["Trough"] = "Trough";
|
|
5
|
+
})(SwingExtremesType || (SwingExtremesType = {}));
|
|
6
|
+
export function findPeaksByGradient(prices) {
|
|
7
|
+
var peaks = [];
|
|
8
|
+
for (var i = 1; i < prices.length - 1; i++) {
|
|
9
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
10
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
11
|
+
if (prevGradient > 0 && nextGradient < 0) {
|
|
12
|
+
peaks.push(i);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return peaks;
|
|
16
|
+
}
|
|
17
|
+
export function findTroughByGradient(prices) {
|
|
18
|
+
var peaks = [];
|
|
19
|
+
for (var i = 1; i < prices.length - 1; i++) {
|
|
20
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
21
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
22
|
+
if (prevGradient < 0 && nextGradient > 0) {
|
|
23
|
+
peaks.push(i);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return peaks;
|
|
27
|
+
}
|
|
28
|
+
export function SwingExtremes(y, type) {
|
|
29
|
+
if (type === SwingExtremesType.Peak) {
|
|
30
|
+
var result = [];
|
|
31
|
+
var indexs = findPeaksByGradient(y);
|
|
32
|
+
result.push(indexs[0]);
|
|
33
|
+
for (var i = 1; i < indexs.length; i++) {
|
|
34
|
+
if (y[indexs[i]] > y[result[result.length - 1]]) {
|
|
35
|
+
result[result.length - 1] = indexs[i];
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
result.push(indexs[i]);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
if (type === SwingExtremesType.Trough) {
|
|
44
|
+
var result = [];
|
|
45
|
+
var indexs = findTroughByGradient(y);
|
|
46
|
+
result.push(indexs[0]);
|
|
47
|
+
for (var i = 1; i < indexs.length; i++) {
|
|
48
|
+
if (y[indexs[i]] < y[result[result.length - 1]]) {
|
|
49
|
+
result[result.length - 1] = indexs[i];
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
result.push(indexs[i]);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
throw new Error("Invalid SwingExtremesType");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { findPeaksByGradient, findTroughByGradient, SwingExtremes, SwingExtremesType, } from "./index";
|
|
2
|
+
describe("test SwingExtremes", function () {
|
|
3
|
+
var prices;
|
|
4
|
+
beforeEach(function () {
|
|
5
|
+
prices = [10, 12, 11, 13, 15, 14, 16, 10, 8, 9, 11, 7, 5, 8, 4, 5];
|
|
6
|
+
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15
|
|
7
|
+
});
|
|
8
|
+
it("test findPeaksByGradient", function () {
|
|
9
|
+
var res = findPeaksByGradient(prices);
|
|
10
|
+
expect(res).toEqual([1, 4, 6, 10, 13]);
|
|
11
|
+
});
|
|
12
|
+
it("test findTroughByGradient", function () {
|
|
13
|
+
var res = findTroughByGradient(prices);
|
|
14
|
+
expect(res).toEqual([2, 5, 8, 12, 14]);
|
|
15
|
+
});
|
|
16
|
+
it("test SwingExtremes Peak", function () {
|
|
17
|
+
var res = SwingExtremes(prices, SwingExtremesType.Peak);
|
|
18
|
+
expect(res).toEqual([6, 10, 13]);
|
|
19
|
+
});
|
|
20
|
+
it("test SwingExtremes Trough", function () {
|
|
21
|
+
var res = SwingExtremes(prices, SwingExtremesType.Trough);
|
|
22
|
+
expect(res).toEqual([2, 14]);
|
|
23
|
+
});
|
|
24
|
+
});
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { default as Angle } from "./analyze/Angle/index.js";
|
|
2
2
|
export { default as simpleRegressionModel } from "./analyze/Regression/simpleRegressoinModel.js";
|
|
3
3
|
export { default as slope } from "./analyze/Slope/index.js";
|
|
4
|
+
export { SwingExtremes, findPeaksByGradient, findTroughByGradient, SwingExtremesType, } from "./analyze/SwingExtremes/index.js";
|
|
4
5
|
export { exponentialSmoothing, movingAverages, weightMovingAverages, } from "./analyze/TimeSeries/R/index.js";
|
|
5
6
|
export { calcSeasonalIndicesNoTrend } from "./analyze/TimeSeries/RS/index.js";
|
|
6
7
|
export { default as Boll } from "./stockSkills/boll.js";
|
package/dist/esm/index.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
export { default as Angle } from "./analyze/Angle/index.js";
|
|
7
7
|
export { default as simpleRegressionModel } from "./analyze/Regression/simpleRegressoinModel.js";
|
|
8
8
|
export { default as slope } from "./analyze/Slope/index.js";
|
|
9
|
+
export { SwingExtremes, findPeaksByGradient, findTroughByGradient, SwingExtremesType, } from "./analyze/SwingExtremes/index.js";
|
|
9
10
|
export { exponentialSmoothing, movingAverages, weightMovingAverages, } from "./analyze/TimeSeries/R/index.js";
|
|
10
11
|
export { calcSeasonalIndicesNoTrend } from "./analyze/TimeSeries/RS/index.js";
|
|
11
12
|
export { default as Boll } from "./stockSkills/boll.js";
|
|
@@ -74,7 +74,6 @@ var Boll = /** @class */ (function () {
|
|
|
74
74
|
var sumMa = list
|
|
75
75
|
.slice(i - (type - 1), i + 1)
|
|
76
76
|
.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
77
|
-
console.log("sumMa", sumMa);
|
|
78
77
|
var bollMa_2 = Math.round((sumMa / type) * 100) / 100;
|
|
79
78
|
// 標準差
|
|
80
79
|
var difference = res
|
package/dist/umd/index.js
CHANGED
|
@@ -112,7 +112,6 @@
|
|
|
112
112
|
// 計算 x 和 y 的平均值
|
|
113
113
|
var y_mean = y.reduce(function (acc, cur) { return acc + cur; }) / y.length;
|
|
114
114
|
var increment = calculateDivisionFactor(y_mean);
|
|
115
|
-
console.log(y_mean, increment);
|
|
116
115
|
var x = Array.from({ length: y.length }, function (_, index) { return index * increment; });
|
|
117
116
|
var x_mean = x.reduce(function (acc, cur) { return acc + cur; }) / x.length;
|
|
118
117
|
// 計算斜率
|
|
@@ -122,6 +121,67 @@
|
|
|
122
121
|
return slope;
|
|
123
122
|
}
|
|
124
123
|
|
|
124
|
+
exports.SwingExtremesType = void 0;
|
|
125
|
+
(function (SwingExtremesType) {
|
|
126
|
+
SwingExtremesType["Peak"] = "Peak";
|
|
127
|
+
SwingExtremesType["Trough"] = "Trough";
|
|
128
|
+
})(exports.SwingExtremesType || (exports.SwingExtremesType = {}));
|
|
129
|
+
function findPeaksByGradient(prices) {
|
|
130
|
+
var peaks = [];
|
|
131
|
+
for (var i = 1; i < prices.length - 1; i++) {
|
|
132
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
133
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
134
|
+
if (prevGradient > 0 && nextGradient < 0) {
|
|
135
|
+
peaks.push(i);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return peaks;
|
|
139
|
+
}
|
|
140
|
+
function findTroughByGradient(prices) {
|
|
141
|
+
var peaks = [];
|
|
142
|
+
for (var i = 1; i < prices.length - 1; i++) {
|
|
143
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
144
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
145
|
+
if (prevGradient < 0 && nextGradient > 0) {
|
|
146
|
+
peaks.push(i);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return peaks;
|
|
150
|
+
}
|
|
151
|
+
function SwingExtremes(y, type) {
|
|
152
|
+
if (type === exports.SwingExtremesType.Peak) {
|
|
153
|
+
var result = [];
|
|
154
|
+
var indexs = findPeaksByGradient(y);
|
|
155
|
+
result.push(indexs[0]);
|
|
156
|
+
for (var i = 1; i < indexs.length; i++) {
|
|
157
|
+
if (y[indexs[i]] > y[result[result.length - 1]]) {
|
|
158
|
+
result[result.length - 1] = indexs[i];
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
result.push(indexs[i]);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
if (type === exports.SwingExtremesType.Trough) {
|
|
167
|
+
var result = [];
|
|
168
|
+
var indexs = findTroughByGradient(y);
|
|
169
|
+
result.push(indexs[0]);
|
|
170
|
+
for (var i = 1; i < indexs.length; i++) {
|
|
171
|
+
if (y[indexs[i]] < y[result[result.length - 1]]) {
|
|
172
|
+
result[result.length - 1] = indexs[i];
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
result.push(indexs[i]);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
throw new Error("Invalid SwingExtremesType");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
125
185
|
function movingAverages(arr, periods) {
|
|
126
186
|
var response = new Array(periods).fill(0);
|
|
127
187
|
for (var i = periods; i < arr.length; i++) {
|
|
@@ -280,7 +340,6 @@
|
|
|
280
340
|
var sumMa = list
|
|
281
341
|
.slice(i - (type - 1), i + 1)
|
|
282
342
|
.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
283
|
-
console.log("sumMa", sumMa);
|
|
284
343
|
var bollMa_2 = Math.round((sumMa / type) * 100) / 100;
|
|
285
344
|
// 標準差
|
|
286
345
|
var difference = res
|
|
@@ -1634,6 +1693,7 @@
|
|
|
1634
1693
|
exports.Macd = MACD;
|
|
1635
1694
|
exports.Obv = Obv;
|
|
1636
1695
|
exports.Rsi = Rsi;
|
|
1696
|
+
exports.SwingExtremes = SwingExtremes;
|
|
1637
1697
|
exports.Vma = Vma;
|
|
1638
1698
|
exports.Williams = Williams;
|
|
1639
1699
|
exports.add = add;
|
|
@@ -1641,6 +1701,8 @@
|
|
|
1641
1701
|
exports.calculateDivisionFactor = calculateDivisionFactor;
|
|
1642
1702
|
exports.dateFormat = dateFormat;
|
|
1643
1703
|
exports.exponentialSmoothing = exponentialSmoothing;
|
|
1704
|
+
exports.findPeaksByGradient = findPeaksByGradient;
|
|
1705
|
+
exports.findTroughByGradient = findTroughByGradient;
|
|
1644
1706
|
exports.getWeekLine = getWeekLine;
|
|
1645
1707
|
exports.isJSON = isJSON;
|
|
1646
1708
|
exports.minus = minus;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ch20026103/anysis",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13-alpha",
|
|
4
4
|
"description": "provide many analyze methods in the library.",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"bugs": "git@github.com:cosmic1330/anysis/issues",
|
|
@@ -12,21 +12,6 @@
|
|
|
12
12
|
"module": "dist/esm/index.js",
|
|
13
13
|
"browser": "dist/umd/index.js",
|
|
14
14
|
"types": "dist/esm/index.d.ts",
|
|
15
|
-
"scripts": {
|
|
16
|
-
"build": "pnpm clean && pnpm build:esm && pnpm build:cjs && pnpm build:umd",
|
|
17
|
-
"build:cjs": "tsc --module commonjs --target es5 --outDir dist/cjs",
|
|
18
|
-
"build:esm": "tsc --module esnext --target es5 --outDir dist/esm",
|
|
19
|
-
"build:umd": "rollup dist/esm/index.js --file dist/umd/index.js --format umd --name anysis",
|
|
20
|
-
"clean": "rimraf dist",
|
|
21
|
-
"lint": "eslint --fix \"**/*.{js,jsx,ts,tsx,mjs}\"",
|
|
22
|
-
"prepare": "pnpm exec husky install",
|
|
23
|
-
"prettier": "pnpm exec prettier --write .",
|
|
24
|
-
"prepublishOnly": "pnpm build",
|
|
25
|
-
"published": "npm publish",
|
|
26
|
-
"unpublished": "npm unpublish --force --registry http://localhost:4873 ",
|
|
27
|
-
"test": "vitest",
|
|
28
|
-
"demo": "node demo/main.js"
|
|
29
|
-
},
|
|
30
15
|
"lint-staged": {
|
|
31
16
|
"*.{js,jsx,ts,tsx,mjs}": [
|
|
32
17
|
"pnpm lint"
|
|
@@ -57,5 +42,18 @@
|
|
|
57
42
|
},
|
|
58
43
|
"vota": {
|
|
59
44
|
"node": "16.11.0"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "pnpm clean && pnpm build:esm && pnpm build:cjs && pnpm build:umd",
|
|
48
|
+
"build:cjs": "tsc --module commonjs --target es5 --outDir dist/cjs",
|
|
49
|
+
"build:esm": "tsc --module esnext --target es5 --outDir dist/esm",
|
|
50
|
+
"build:umd": "rollup dist/esm/index.js --file dist/umd/index.js --format umd --name anysis",
|
|
51
|
+
"clean": "rimraf dist",
|
|
52
|
+
"lint": "eslint --fix \"**/*.{js,jsx,ts,tsx,mjs}\"",
|
|
53
|
+
"prettier": "pnpm exec prettier --write .",
|
|
54
|
+
"published": "npm publish",
|
|
55
|
+
"unpublished": "npm unpublish --force --registry http://localhost:4873 ",
|
|
56
|
+
"test": "vitest",
|
|
57
|
+
"demo": "node demo/main.js"
|
|
60
58
|
}
|
|
61
|
-
}
|
|
59
|
+
}
|