夜雨聆风学习资料网

ARTICLE · 995172

用excel盯盘

用excel盯盘

上班族开股票行情软件显得非常不尊重工作,以前就有用excel盯盘的,根本看不出你是在工作还是在摸鱼。不过上古时期是怎么编写的程序咱也搞不懂,只会拿来就用,根本不会自己添加需要的功能。

好在AI时代来了,只要有高中水平的知识储备,我们也可以手搓一个excel盯盘工具。

根据上古大神的设计思路,就是启用宏命令,在某一单元格(比如A1)输入股票代码,每次重新计算就在临近格获取当前股价。我们稍微优化一下,你可以这样问AI:用excel通过宏获取指定股票的现价,第二行放股票代码,第三行获取现价,做两个按钮,一个从新浪获取数据,另一个从腾讯获取数据。

大概就是如下效果:

AI会给你一段vba代码,你需要启用宏,并在表格中画两个按钮并将按钮和对应功能绑定。我获得的是这样的代码,如果你的代码有错误可以让AI继续改进或者直接换个AI问。

Function GetSinaHttpGBK(url As String) As String    Dim http As Object    ' 改用 WinHttpRequest,TLS 和 Header 控制更稳    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")    ' 强制 TLS1.2(Win7/Win10 兼容)    http.Option(9) = 2048    http.Open "GET", url, False    ' 新浪必须带以下头,否则直接 403 或 Kinsoku 报错    http.SetRequestHeader "Referer", "https://finance.sina.com.cn/"    http.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"    On Error Resume Next    http.Send    If http.Status <> 200 Then        GetSinaHttpGBK = ""        Set http = Nothing        Exit Function    End If    ' GBK 转码    Dim stream As Object    Set stream = CreateObject("ADODB.Stream")    stream.Type = 1    stream.Open    stream.Write http.ResponseBody    stream.Position = 0    stream.Type = 2    stream.Charset = "GBK"    GetSinaHttpGBK = stream.ReadText    stream.Close    Set stream = Nothing    Set http = NothingEnd FunctionSub GetPrice_Sina()    Dim ws As Worksheet    Set ws = ThisWorkbook.Sheets(1)    Dim lastCol As Long    lastCol = ws.Cells(2, ws.Columns.Count).End(xlToLeft).Column    Dim i As Long    For i = 2 To lastCol        Dim stockCode As String        stockCode = Trim(ws.Cells(2, i).Value)        If stockCode = "" Then GoTo NextCol        ' 必须用 HTTPS        Dim url As String        url = "https://hq.sinajs.cn/list=" & stockCode        Dim resp As String        resp = GetSinaHttpGBK(url)        If resp = "" Then            ws.Cells(3, i).Value = "ERR"            GoTo NextCol        End If        On Error Resume Next        Dim parts() As String        parts = Split(resp, """")        Dim dataFields() As String        dataFields = Split(parts(1), ",")        Dim price As String        price = Trim(dataFields(3))        If IsNumeric(price) Then            ws.Cells(3, i).Value = CDbl(price)        Else            ws.Cells(3, i).Value = "N/A"        End If        On Error GoTo 0NextCol:    Next i    MsgBox "新浪财经:获取完成!", vbInformationEnd Sub'==========================================' 腾讯按钮 → 获取现价到第三行'==========================================Sub GetPrice_Tencent()    Dim ws As Worksheet    Set ws = ThisWorkbook.Sheets(1)    Dim lastCol As Long    lastCol = ws.Cells(2, ws.Columns.Count).End(xlToLeft).Column    ' 从 B 列开始(跳过 A 列)    Dim i As Long    For i = 2 To lastCol        Dim stockCode As String        stockCode = Trim(ws.Cells(2, i).Value)        If stockCode = "" Then GoTo NextCol        Dim url As String        url = "http://qt.gtimg.cn/q=" & stockCode        Dim resp As String        resp = GetSinaHttpGBK(url)        If resp = "" Then            ws.Cells(3, i).Value = "ERR"            GoTo NextCol        End If        ' 解析现价:按双引号分割,再按 ~ 分割        ' 腾讯格式:v_xxx="类型~名称~代码~现价~昨收~今开~..."        ' 现价在 ~ 分割后的 index 3        On Error Resume Next        Dim parts() As String        parts = Split(resp, """")        Dim dataFields() As String        dataFields = Split(parts(1), "~")        Dim price As String        price = Trim(dataFields(3))        If IsNumeric(price) Then            ws.Cells(3, i).Value = CDbl(price)        Else            ws.Cells(3, i).Value = "N/A"        End If        On Error GoTo 0NextCol:    Next i    MsgBox "腾讯财经:获取完成!", vbInformationEnd Sub

在C列之后可以任意添加股票代码,建议不要超过10个,而且刷新频率也不要低于30秒,否则可能会被对方认为是爬虫从而封禁你的ip。

另外,不光能获取现价,还能获取名称、开盘、昨收、最高、最低、成交量等字段,根据自己需要让AI修改即可。


基本功能就是这样了,这时候我们还可以添加功能,比如把当前价格添加到sheet2的最后一行,你就继续问AI:我要做一个按钮,把当前价格作为快照记录到sheet2的最后一行。效果大概就是这样的

这时候AI又会给你一段vba代码,大概是这样的

Sub RecordDataSnapshot()    Dim wsSource As Worksheet    Dim wsTarget As Worksheet    Dim nextRow As Long    ' 定义工作表    Set wsSource = ThisWorkbook.Sheets("Sheet1")    Set wsTarget = ThisWorkbook.Sheets("Sheet2")    ' 在Sheet2中找到第一列最后一个非空单元格的下一行    nextRow = wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row + 1    ' 关键:使用 .Value2 仅复制数值(忽略公式),速度更快更干净    wsTarget.Range("A" & nextRow).Value2 = wsSource.Range("A3").Value2 ' 日期    wsTarget.Range("B" & nextRow & ":J" & nextRow).Value2 = wsSource.Range("B3:J3").Value2 ' 数据区域    ' 提示完成(可选,不想弹窗可以把下面这行删掉)    MsgBox "数据已固化至 Sheet2 第 " & nextRow & " 行!", vbInformationEnd Sub

每按一次记录按钮,就会把当前的价格作为快照记录到sheet2的最后一行,之后就可以按照sheet2的数据自己做分析,做回测啦。

需要其他更多功能,可以继续向AI提问,不过excel毕竟不是专业工具,还是越简单越好。

另外,如果不需要做数据回测,也就不需要excel的数据处理能力,这就可以做成数据看板模式,一样可以用AI手搓一个html网页来实现。

相关学习资料