以SQL Server绘制均线图:实用技巧分享

介绍

均线图(MA)是一种用于股票、期货等市场交易分析的技术图表。简单来说,就是求出一段时间内价格(或收盘价)的平均值,根据平均值的变化趋势,辅助交易者分析判断价格走势的趋势、方向、支撑位和压力位等。在股票交易和期货交易中,均线图是非常常用和重要的技术工具。

在这篇文章中,我们将探讨如何使用SQL Server绘制股票的均线图。

数据源

首先需要准备数据。本文的数据是从Yahoo财经上获取的苹果公司(AAPL)的股票历史数据。下载数据后,我们需要将数据导入SQL Server。为了简化本文,我们将仅使用数据中的日期和收盘价两个字段。以下是简化后的示例数据:

CREATE TABLE [dbo].[AppleStock](

[Date] [date] NOT NULL,

[Close] [float] NOT NULL

)

INSERT INTO [dbo].[AppleStock] ([Date], [Close])

VALUES

('2020-08-10', 450.91),

('2020-08-07', 444.45),

('2020-08-06', 455.61),

('2020-08-05', 440.25),

('2020-08-04', 438.66),

('2020-08-03', 435.75),

('2020-07-31', 425.04),

('2020-07-30', 384.76),

('2020-07-29', 380.16),

('2020-07-28', 373.01)

计算均线

计算均线的方法很简单。我们可以按日期升序排列数据后,对每个日期的最后n个收盘价求平均值,即为第n日均线的值。以下是计算5日和20日均线的SQL代码:

SELECT

[Date],

[Close],

AVG([Close]) OVER (ORDER BY [Date] ROWS 4 PRECEDING) AS [MA5],

AVG([Close]) OVER (ORDER BY [Date] ROWS 19 PRECEDING) AS [MA20]

FROM [dbo].[AppleStock]

在上面的SQL语句中,我们使用了窗口函数AVG对每个收盘价求平均值。使用ORDER BY [Date]语句按日期升序排列数据,使用ROWS 4 PRECEDING表示取当前行及前4行的收盘价求平均值,即为5日均线。同理,ROWS 19 PRECEDING表示取当前行及前19行的收盘价求平均值,即为20日均线。

绘制均线图

有了均线数据,我们可以使用Power BI等工具绘制均线图。但是,本文的重点是探讨如何使用SQL Server绘制均线图。在SQL Server中,我们可以使用FOR XML方式将结果集转换成XML格式,再使用HTML、JavaScript等技术将XML数据绘制成图表。以下是绘制5日和20日均线图的SQL代码:

SELECT

[Date],

[Close],

(SELECT AVG([Close]) AS [MA5]

FROM [dbo].[AppleStock]

WHERE [Date] BETWEEN DATEADD(day, -4, t.[Date]) AND t.[Date]) AS [MA5],

(SELECT AVG([Close]) AS [MA20]

FROM [dbo].[AppleStock]

WHERE [Date] BETWEEN DATEADD(day, -19, t.[Date]) AND t.[Date]) AS [MA20]

FROM [dbo].[AppleStock] AS t

ORDER BY [Date]

FOR XML RAW('Data'), ROOT('ChartData'), ELEMENTS XSINIL

在上面的SQL语句中,我们使用了子查询和BETWEEN语句计算均线值。同样地,我们使用ORDER BY [Date]语句按日期升序排列数据。使用FOR XML语句将结果集输出为如下格式的XML数据:

<ChartData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<Data>

<Date>2020-07-28</Date>

<Close>373.01</Close>

<MA5>385.326</MA5>

<MA20>396.1195</MA20>

</Data>

<Data>

...

</Data>

...

</ChartData>

我们将上面的XML数据复制到一个HTML文件中,再使用JavaScript和Chart.js等图表库绘制均线图。以下是绘制均线图的HTML和JavaScript代码。

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>均线图</title>

<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.3/dist/chart.js"></script>

</head>

<body>

<canvas id="myChart"></canvas>

<script>

fetch('data.xml') //从XML文件中获取数据

.then(response => response.text())

.then(text => {

let data = (new window.DOMParser()).parseFromString(text, "text/xml").querySelectorAll("Data")

let dates = [], closes = [], ma5s = [], ma20s = []

data.forEach(d => {

dates.push(d.querySelector("Date").textContent)

closes.push(parseFloat(d.querySelector("Close").textContent))

ma5s.push(parseFloat(d.querySelector("MA5").textContent))

ma20s.push(parseFloat(d.querySelector("MA20").textContent))

})

new window.Chart(document.getElementById("myChart"), {

type: 'line',

data: {

labels: dates,

datasets: [

{

label: '收盘价',

data: closes,

borderColor: 'rgb(255, 99, 132)',

tension: 0.1

},

{

label: '5日均线',

data: ma5s,

borderColor: 'rgb(54, 162, 235)',

tension: 0.1

},

{

label: '20日均线',

data: ma20s,

borderColor: 'rgb(255, 205, 86)',

tension: 0.1

}

]

},

options: {}

});

});

</script>

</body>

</html>

在上面的HTML和JavaScript代码中,我们使用XMLHttpRequest对象从XML文件中获取数据,并使用querySelectorAll和querySelector方法从XML数据中读取日期、收盘价和均线值。使用Chart.js的线性图表功能绘制均线图。

总结

本文介绍了使用SQL Server绘制股票的均线图的技巧。主要包括计算均线和绘制均线图两个方面。计算均线的方法是使用窗口函数或子查询,绘制均线图的方法是将结果集输出为XML格式,并使用JavaScript和图表库绘制均线图。在技术实现的基础上,本文也简要介绍了股票和均线图的基本概念。相信掌握了这些技能,读者可以更加灵活地应用SQL Server和其他工具进行股票交易的分析和决策。

数据库标签