实现对文件夹中的涨停数据给出历史30天数据的折线图

利用周末两天实现了查看股票中历史折线信息的VBA程式。将VBA文档和股票历史数据放在F盘根目录下fiance文件夹中,股票历史数据取第一列为时间横轴,第四列为当日收盘,第11列为当日换手率。两条折线。。针对每个涨停折线图停留时间为3秒。

数据文件格式如下:

结果图如下:

 

Sub showLine()
Dim s As FileSearch
Dim Workbook, dataExcel, newSheet
Dim fileNum As Integer
Dim jRows, totalFile, totalRows, copyNum, totalNum2, realNum As Integer
Dim ch As ChartObject
Dim rng1, rng2, rng3 As Range
Dim testvalue1, testvalue2

testvalue1 = 0
Set s = Application.FileSearch
s.LookIn = "F:\finace"
s.Filename = "*.*"
s.Execute

totalFile = s.FoundFiles.Count
Set dataExcel = CreateObject("Excel.Application")

'如下针对每个文件进行画折线图

For i = 1 To totalFile
Cells(i, 1) = s.FoundFiles(i)
Cells(1, 6) = s.FoundFiles(i)
Set Workbook = dataExcel.Workbooks.Open(s.FoundFiles(i))
Set newSheet = Workbook.Sheets(1)

totalRows = newSheet.UsedRange.Rows.Count
For jRows = 2 To totalRows

If newSheet.Cells(jRows, 10) > 9.9 And jRows + 35 < totalRows And newSheet.Cells(jRows, 10) <> "None" Then

realNum = 0
Cells(1, 7) = newSheet.Cells(jRows, 1)
Cells(1, 8) = newSheet.Cells(jRows, 4)

For copyNum = 30 To 1 Step -1
If newSheet.Cells(jRows + copyNum - 1, 4).Value <> 0 Then

realNum = realNum + 1
Sheets("Sheet2").Cells(realNum, 1) = newSheet.Cells(jRows + copyNum - 1, 1)
Sheets("Sheet2").Cells(realNum, 4) = newSheet.Cells(jRows + copyNum - 1, 4)
Sheets("Sheet2").Cells(realNum, 11) = newSheet.Cells(jRows + copyNum - 1, 11)
End If

Next
Set rng1 = Worksheets("Sheet2").Range("a1:a" & realNum)
Set rng2 = Worksheets("Sheet2").Range("d1:d" & realNum)
Set rng3 = Worksheets("Sheet2").Range("k1:k" & realNum)
If WorksheetFunction.Max(rng2.Value) - WorksheetFunction.Min(rng2.Value) <> 0 And WorksheetFunction.Max(rng2.Value) <> 0 Then
'画折线图
On Error GoTo err:
Worksheets("Sheet1").ChartObjects("收盘和换手率").Delete
err:

Set ch = Worksheets("Sheet1").ChartObjects.Add(80, 20, 800, 400)
ch.Name = "收盘和换手率"

With ch.Chart
            .ChartType = xlLine
            .SeriesCollection.NewSeries
            .SeriesCollection(1).Values = rng2
            .SeriesCollection(1).XValues = rng1
            .SeriesCollection(1).Name = "收盘价"
            .SeriesCollection.NewSeries
            .SeriesCollection(2).Values = rng3
            .SeriesCollection(2).XValues = rng1
            .SeriesCollection(2).Name = "换手率"
End With
   ch.Chart.SeriesCollection(1).AxisGroup = 1
   ch.Chart.SeriesCollection(1).MarkerStyle = xlNone
   ch.Chart.SeriesCollection(2).AxisGroup = 2
   ch.Chart.SeriesCollection(2).MarkerStyle = xlNone
With ch.Chart.Axes(xlValue, xlPrimary)
             .MajorUnit = (WorksheetFunction.Max(rng2.Value) - WorksheetFunction.Min(rng2.Value)) / 10
             .MaximumScale = WorksheetFunction.Max(rng2.Value) + (.MajorUnit) * 2
             .MinimumScale = WorksheetFunction.Min(rng2.Value) - (.MajorUnit) * 2
             .CrossesAt = .MinimumScale
             .TickLabels.Font.Size = 8
End With
With ch.Chart.Axes(xlValue, xlSecondary)
             .MajorUnit = (WorksheetFunction.Max(rng3.Value) - WorksheetFunction.Min(rng3.Value)) / 10
             .MaximumScale = WorksheetFunction.Max(rng3.Value) + (.MajorUnit) * 2
             .MinimumScale = WorksheetFunction.Min(rng3.Value) - (.MajorUnit) * 2
             .CrossesAt = .MinimumScale
             .TickLabels.Font.Size = 8
End With
With ch.Chart.Axes(xlCategory).TickLabels
        .Font.Size = 8
        .NumberFormatLocal = "yy-m-d"
End With
Set rng1 = Nothing
Set rng2 = Nothing
Set rng3 = Nothing
Set ch = Nothing

Application.Wait (Now + TimeValue("00:00:02"))

End If

'画折线图

ElseIf newSheet.Cells(jRows, 10) > 9.9 And jRows < totalRows - 3 And newSheet.Cells(jRows, 10) <> "None" Then

totalNum2 = totalRows - jRows
realNum = 0

Cells(1, 7) = newSheet.Cells(jRows, 1)
Cells(1, 8) = newSheet.Cells(jRows, 4)

For copyNum = totalNum2 To 1 Step -1

If newSheet.Cells(jRows + copyNum - 1, 4).Value <> 0 Then
realNum = realNum + 1
Sheets("Sheet2").Cells(realNum, 1) = newSheet.Cells(jRows + copyNum - 1, 1)
Sheets("Sheet2").Cells(realNum, 4) = newSheet.Cells(jRows + copyNum - 1, 4)
Sheets("Sheet2").Cells(realNum, 11) = newSheet.Cells(jRows + copyNum - 1, 11)
End If
Next

If realNum < 10 Then
Set rng1 = Worksheets("Sheet2").Range("a1:a10")
Set rng2 = Worksheets("Sheet2").Range("d1:d10")
Set rng3 = Worksheets("Sheet2").Range("k1:k10")
Else
Set rng1 = Worksheets("Sheet2").Range("a1:a" & realNum)
Set rng2 = Worksheets("Sheet2").Range("d1:d" & realNum)
Set rng3 = Worksheets("Sheet2").Range("k1:k" & realNum)

End If
If WorksheetFunction.Max(rng2.Value) - WorksheetFunction.Min(rng2.Value) <> 0 And WorksheetFunction.Max(rng2.Value) <> 0 Then
'画折线图
On Error GoTo err2:
Worksheets("Sheet1").ChartObjects("收盘和换手率").Delete
err2:
Set ch = Worksheets("Sheet1").ChartObjects.Add(80, 20, 800, 400)
ch.Name = "收盘和换手率"
With ch.Chart
            .ChartType = xlLine
            .SeriesCollection.NewSeries
            .SeriesCollection(1).Values = rng2
            .SeriesCollection(1).XValues = rng1
            .SeriesCollection(1).Name = "收盘价"
            .SeriesCollection.NewSeries
            .SeriesCollection(2).Values = rng3
            .SeriesCollection(2).XValues = rng1
            .SeriesCollection(2).Name = "换手率"
End With
   ch.Chart.SeriesCollection(1).AxisGroup = 1
   ch.Chart.SeriesCollection(1).MarkerStyle = xlNone
   ch.Chart.SeriesCollection(2).AxisGroup = 2
   ch.Chart.SeriesCollection(2).MarkerStyle = xlNone
 
With ch.Chart.Axes(xlValue, xlPrimary)
             .MajorUnit = (WorksheetFunction.Max(rng2.Value) - WorksheetFunction.Min(rng2.Value)) / 10
             .MaximumScale = WorksheetFunction.Max(rng2.Value) + (.MajorUnit) * 2
             .MinimumScale = WorksheetFunction.Min(rng2.Value) - (.MajorUnit) * 2
             .CrossesAt = .MinimumScale
             .TickLabels.Font.Size = 8
End With
With ch.Chart.Axes(xlValue, xlSecondary)
             .MajorUnit = (WorksheetFunction.Max(rng3.Value) - WorksheetFunction.Min(rng3.Value)) / 10
             .MaximumScale = WorksheetFunction.Max(rng3.Value) + (.MajorUnit) * 2
             .MinimumScale = WorksheetFunction.Min(rng3.Value) - (.MajorUnit) * 2
             .CrossesAt = .MinimumScale
             .TickLabels.Font.Size = 8
End With
With ch.Chart.Axes(xlCategory).TickLabels
        .Font.Size = 8
        .NumberFormatLocal = "yy-m-d"
End With
Set rng1 = Nothing
Set rng2 = Nothing
Set rng3 = Nothing
Set ch = Nothing

Application.Wait (Now + TimeValue("00:00:02"))

End If

'画折线图

End If
Next

Workbook.Save
Workbook.Close

Next

End Sub

<think>嗯,用户现在想找关于实时数据计算涨停的解决方案或方法。首先,我需要明确他们的具体需求。实时数据处理在金融领域确实很重要,尤其是计算涨停这种需要快速响应的场景。用户可能是在开发一个交易系统,或者在做高频交易相关的分析,需要及时捕捉股票价格触及涨停的情况。 首先,我得回顾一下实时数据处理的基本架构。通常,实时处理系统会用到流处理框架,比如Apache Kafka用于数据传输,Flink或Spark Streaming来处理数据流。用户提到的计算涨停算法,可能需要实时接收股票行情数据,然后根据预设的条件(比如涨幅超过10%)来判断是否涨停。 然后,涨停的计算逻辑。A股市场的涨停板通常是前一日收盘价的10%,但ST股是5%,科创板可能不同。所以算法需要考虑不同的股票类型,可能需要一个规则引擎或者配置文件来管理这些规则。此外,还要注意数据的时间窗口,比如是否是日内数据,是否需要处理集合竞价阶段的数据,这些都可能影响计算结果的准确性。 接下来,技术实现部分。用户可能需要代码示例,比如用Python的pandas处理实时数据,或者结合流处理框架。但实时处理通常需要更高效的工具,比如使用Flink的窗口函数来计算实时涨幅。不过用户提供的引用中提到yfinance可以获取历史数据,但实时数据可能需要其他来源,比如websocket接口。代码示例部分可能需要展示如何计算涨幅,比如用当前价与前收盘价比较,超过则标记涨停。 另外,用户提供的引用里提到了金融时间序列的特性,比如非平稳、非线性,这些可能影响模型的预测能力。但计算涨停更多是实时规则判断,可能不需要复杂的模型,但需要考虑数据的实时性和准确性。引用中的事件抽取技术可能相关,比如从新闻中抽取影响股价的事件,但用户当前的问题更偏向于数据处理而非文本分析。 可能还需要考虑性能优化,比如如何高效处理大量实时数据,避免延迟。分布式计算框架或者内存数据库如Redis可能用在这里。同时,异常处理也很重要,比如数据延迟或丢失时的处理机制。 用户可能没有明确说出的是,他们可能需要一个完整的系统架构,包括数据接入、处理、存储和报警机制。比如,当检测到涨停时,触发通知或者自动交易。此外,合规性和数据源的可靠性也是需要考虑的因素。 最后,生成相关问题时要围绕用户的需求扩展,比如性能优化、异常处理、系统架构设计、数据源选择等,帮助他们全面了解实时计算涨停的各个方面。</think>### 实时数据计算涨停的解决方案 #### 1. **核心算法逻辑** 涨停计算需结合**实时行情数据**与**前收盘价**,判断当前价格是否达到涨幅阈值: - **A股标准**:普通股票涨幅阈值为前收盘价的10%(ST股为5%) - **公式**: $$ \text{涨停价} = \text{前收盘价} \times (1 + \text{涨幅阈值}) $$ $$ \text{是否涨停} = \begin{cases} 1 & \text{当前价} \geq \text{涨停价} \\ 0 & \text{否则} \end{cases} $$ #### 2. **实时数据处理架构** ``` [数据源] → [流式处理引擎] → [涨停计算模块] → [报警/存储] ``` - **推荐工具**: - **Apache Kafka**:高吞吐量实时数据管道 - **Apache Flink**:低延迟流式计算引擎 - **Redis**:实时状态存储(如缓存前收盘价) #### 3. **代码示例(Python伪代码)** ```python import pandas as pd from yfinance import Ticker def check_limit_up(realtime_data, prev_close): threshold = 0.10 # 普通股票阈值 limit_price = prev_close * (1 + threshold) return realtime_data['price'] >= limit_price # 实时数据流处理(模拟) symbol = '600519.SS' # 贵州茅台 stock = Ticker(symbol) prev_close = stock.history(period='1d')['Close'].iloc[-1] while True: realtime_data = get_realtime_price(symbol) # 实现实时数据接口 if check_limit_up(realtime_data, prev_close): trigger_alert(f"{symbol} 涨停触发") ``` #### 4. **关键挑战与解决方案** - **数据延迟**:采用**事件时间处理**与**水位线机制**(Flink特性)[^2] - **状态管理**:使用**分布式检查点**保存计算中间状态 - **规则扩展**:通过**动态配置加载**支持不同市场规则(如科创板20%阈值) #### 5. **性能优化方向** - **并行计算**:按股票代码分片处理 - **向量化计算**:使用NumPy加速数值运算 - **异步IO**:实现非阻塞数据访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值