Python數據分析--Numpy常用函數介紹(4)--Numpy中的線性關係和數據修剪壓縮

来源:https://www.cnblogs.com/codingchen/archive/2022/05/24/16304038.html
-Advertisement-
Play Games

摘要:總結股票均線計算原理--線性關係,也是以後大數據處理的基礎之一,NumPy的 linalg 包是專門用於線性代數計算的。作一個假設,就是一個價格可以根據N個之前的價格利用線性模型計算得出。 前一篇,在計算均線,指數均線時,分別計算了不同的權重,比如 和 都是按不同的計算方法來計算出相關的權重, ...


摘要:總結股票均線計算原理--線性關係,也是以後大數據處理的基礎之一,NumPy的 linalg 包是專門用於線性代數計算的。作一個假設,就是一個價格可以根據N個之前的價格利用線性模型計算得出。

    前一篇,在計算均線,指數均線時,分別計算了不同的權重,比如

都是按不同的計算方法來計算出相關的權重,一個股價可以用之前股價的線性組合表示出來,也即,這個股價等於之前的股價與各自的繫數相乘後再做加和的結果,但是,這些繫數是需要我們來確定的,也即一個線性相關的權重。
一、用線性模型預測價格
創建步驟如下:
1)先獲取一個包含N個收盤價的向量(數組):
N=10
#N=len(close)
new_close = close[-N:]
new_closes= new_close[::-1]
print (new_closes)
運行結果:[39.96 38.03 38.5  38.6  36.89 37.15 36.61 37.21 36.98 36.47]

2)初始化一個N×N的二維數組 A ,元素全部為 0
A = np.zeros((N, N), float)
print ("Zeros N by N", A)

3)用數組new_closes的股價填充數組A

for i in range(N):
    A[i,] = close[-N-i-1: -1-i]
print( "A", A)

試一下運行結果,並觀察填充後的數組A

4)選取合適的權重

Weights [0.11405072 0.14644403 0.18803785 0.24144538 0.31002201]和The weights : [0.2 0.2 0.2 0.2 0.2]哪一種權重更合理?用線性代數的術語來說,就是解一個最小二乘法的問題。

要確定線性模型中的權重繫數,就是解決最小平方和的問題,可以使用 linalg包中的 lstsq 函數來完成這個任務

(x, residuals, rank, s) = np.linalg.lstsq(A,new_closes)

其中,x是由A,new_closes通過np.linalg.lstsq()函數,即生成的權重(向量),residuals為殘差數組、rank為A的秩、s為A的奇異值。

5)預測股價,用NumPy中的 dot()函數計算繫數向量與最近N個價格構成的向量的點積(dot product),這個點積就是向量new_closes中價格的線性組合,繫數由向量 x 提供

print( np.dot(new_closes, x))

完整代碼如下:

import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt

def datestr2num(s): #定義一個函數
    return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday()

dates, opens, high, low, close,vol=np.loadtxt('data.csv',delimiter=',', usecols=(1,2,3,4,5,6),
                       converters={1:datestr2num},unpack=True)

N=10
#N=len(close)
new_close = close[-N:]
new_closes= new_close[::-1]

A = np.zeros((N, N), float)

for i in range(N):
    A[i,] = close[-N-i-1: -1-i]
    
print( "A", A)

(x, residuals, rank, s) = np.linalg.lstsq(A,new_closes)
print(x) #權重繫數向量 

print('\n')
print(residuals)  #殘差數組
print('\n')
print(rank) #A的秩
print(s)
print('\n')#奇異值
print( np.dot(new_closes, x))

運行結果如下:

二、趨勢線

趨勢線,是根據股價走勢圖上很多所謂的樞軸點繪成的曲線。描繪價格變化的趨勢。可以讓電腦來用非常簡易的方法來繪製趨勢線

(1) 確定樞軸點的位置。假定樞軸點位置 為最高價、最低價和收盤價的算術平均值。pivots = (high + low + close ) / 3

從樞軸點出發,可以推導出股價所謂的阻力位和支撐位。阻力位是指股價上升時遇到阻力,在轉跌前的最高價格;支撐位是指股價下跌時遇到支撐,在反彈前的最低價格(阻力位和支撐位並非客觀存在,它們只是一個估計量)。基於這些估計量,就可以繪製出阻力位和支撐位的趨勢線。我們定義當日股價區間為最高價與最低價之差

 (2) 定義一個函數用直線 y= at + b 來擬合數據,該函數應返回繫數 a 和 b,再次用到 linalg 包中的 lstsq 函數。將直線方程重寫為 y = Ax 的形式,其中 A = [t 1] , x = [a b] 。使用 ones_like 和 vstack 函數來構造數組 A

 numpy.ones_like(a, dtype=None, order='K', subok=True) 返回與指定數組具有相同形狀和數據類型的數組,並且數組中的值都為1。

numpy.vstack(tup)     [source]  垂直(行)按順序堆疊數組。  這等效於形狀(N,)的1-D數組已重塑為(1,N)後沿第一軸進行concatenation。 重建除以vsplit的數組。如下兩小例:

>>> a = np.array([1, 2, 3]) 
>>> b = np.array([2, 3, 4])
>>> np.vstack((a,b))
array([[1, 2, 3],
[2, 3, 4]])
>>> a = np.array([[1], [2], [3]]) 
>>> b = np.array([[2], [3], [4]]) 
>>> np.vstack((a,b)) 
array([[1],
       [2],   
       [3], 
       [2],
       [3], 
       [4]])    

 完整代碼如下:

import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt

def datestr2num(s): #定義一個函數
    return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday()

dates, opens, high, low, close,vol=np.loadtxt('data.csv',delimiter=',', usecols=(1,2,3,4,5,6),
                       converters={1:datestr2num},unpack=True)
"""
N=10
#N=len(close)
new_close = close[-N:]
new_closes= new_close[::-1]


A = np.zeros((N, N), float)

for i in range(N):
    A[i,] = close[-N-i-1: -1-i]
   
print( "A", A)
(x, residuals, rank, s) = np.linalg.lstsq(A,new_closes)
print(x) #權重繫數向量 
print(residuals)  #殘差數組
print(rank) #A的秩
print(s)
print( np.dot(new_closes, x))
"""
pivots = (high + low + close ) / 3

def fit_line(t, y):
    A = np.vstack([t, np.ones_like(t)]).T
# np.ones_like(t) 即定義一個像t一樣,有相同形狀和數據類型的數組,並且數組中的值都為1 
    return np.linalg.lstsq(A, y)[0]

t = np.arange(len( close)) #按close數列創建一個數列t

sa, sb = fit_line(t, pivots - (high - low)) #用直線y=at+b來擬合數據,該函數應返回繫數a(sa) 和 b(sb)
ra, rb = fit_line(t, pivots + (high - low))
support = sa * t + sb     #計算支撐線數列
resistance = ra * t + rb  #計算阻力線數列

condition = (close > support) & (close < resistance)#設置一個判斷數據點是否位於趨勢線之間的條件,作為 where 函數的參數
between_bands = np.where(condition)

plt.plot(t, close,color='r')
plt.plot(t, support,color='g')
plt.plot(t, resistance,color='y')
plt.show()

運行結果:

三、數組的修剪和壓縮

NumPy中的 ndarray 類定義了許多方法,可以對象上直接調用。通常情況下,這些方法會返回一個數組。

ndarray 對象的方法相當多,像前面遇到的 var 、 sum 、 std 、 argmax 、argmin 以及 mean 函數也均為 ndarray 方法。下麵介紹一下數組的修前與壓縮。

1、  clip 方法返回一個修剪過的數組:將所有比給定最大值還大的元素全部設為給定的最大值,而所有比給定最小值還小的元素全部設為給定的最小值

a = np.arange(10)
print("a =", a)
print("Clipped", a.clip(3, 7))

運行結果:

a = [0 1 2 3 4 5 6 7 8 9]
Clipped [3 3 3 3 4 5 6 7 7 7]

很明顯,a.clip(3,7)將數組a中的小於3的設置為3,大於7的全部設置為7.

2、 compress 方法返回一個根據給定條件篩選後的數組

b = np.arange(10)
print (a)
print ("Compressed", a.compress(a >3))

運行結果:

[0 1 2 3 4 5 6 7 8 9]
Compressed [4 5 6 7 8 9]

四、階乘

 prod() 方法,可以計算數組中所有元素的乘積.

c = np.arange(1,5)
print("b =", c)
print("Factorial", c.prod())

運行結果:

b = [1 2 3 4]
Factorial 24

如果想知道1~8的所有階乘值,調用 cumprod()方法,計算數組元素的累積乘積。

print( "Factorials", c.cumprod())

運行結果:

Factorials [  1   2   6  24 120]

 

本篇主要介紹了一個通過現在有數據,用函數 y= at + b 來擬合數據進行線性擬合後,用 linalg包中的 lstsq 函數來完成最小二乘相關後,預測股價的實例,來瞭解了一些numpy的函數及作用;同時介紹 了數據修剪及壓縮和階乘的計算。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第1章 【序章】關於這門課,你需要瞭解得都在這裡 試看3 節 | 5分鐘 前端工程化&ne;Webpack ,真正的前端工程化覆蓋一個項目從創建到開發到發佈的整個流程,既是目前大廠主流的項目提效方案,更是高薪面試 “必考項”!從本章開始,讓我們一起跟隨 Sam 老師,開啟“前端工程化”得升級之旅吧! ...
  • 第1章 課程介紹 試看1 節 | 15分鐘 本章中,將會對課程的內容做介紹說明,總覽課程中涉及到的知識點和學習方向。 收起列表 視頻:1-1 課程介紹 (14:39)試看 第2章 從0搭建一個項目腳手架5 節 | 36分鐘 從0配置開發環境並初始化項目腳手架 收起列表 視頻:2-1 本章導學 (01 ...
  • ###效果圖 ###組件介紹 原生小程式編寫,簡單輕便,拿來即用。 gitee地址:https://gitee.com/qq_connect-EC6BCC0B556624342/wx-calendar ###代碼部分(這裡可能不是最新的推薦去gitee克隆代碼) calendar.wxml <!-- ...
  • 階段一:課程設計及前端創建腳手架開發 第1周 需求分析和架構設計:做什麼,如何做? 開工之前,先來看看我們到底要做一個什麼項目,有哪些功能。然後站在上帝視角,從整體的架構層面,該如何設計該項目。 課程安排: 1、需求分析-瞭解軟體開發生命周期2、技術整體架構3、研發流程優化背後的思考4、為什麼要優化 ...
  • 建議您在閱覽此文之前學完W3school - JS Tutorial章節所有內容 經典的問題 在一些文章中或者工作面試問題上,會遇見這種看似簡單的經典問題。 for(var i = 0; i < 5; i++) { setTimeout(function () { console.log(i); } ...
  • Vivus是一個輕量級的JavaScript類(沒有依賴關係),它允許您對svg進行動畫處理,使它們具有正在繪製的外觀。有多種不同的動畫可供選擇,還可以創建自定義腳本,以您喜歡的任何方式繪製SVG。 一、安裝 npm:npm install vivus bower install vivus 通過s ...
  • 今天,有在群里看到這樣一個問題:有一個動畫,一開始靜止處於第一幀,只在用戶 hover 的時候運行動畫,在運行一次後停止,並且停留在最後一幀,使用 CSS 可以完成麽? 像是這樣: 一個非常有意思的問題,答案是可以的。我們抽取一下其中的關鍵點: 動畫只運行一次,未運行前處於第一幀,運行完後處於最後一 ...
  • 前端周刊:2022-8 期 前端開發 為什麼視頻網站的視頻鏈接地址是 blob? 很詳細的講解瞭如何實現視頻流式傳輸,還能防盜鏈 實時 html5 的 mp3 播放。再次體驗數據格式 arraybuffer。 音頻防盜鏈 前端工具箱-css 動畫緩動函數預覽及生成 css 動畫緩動函數預覽及生成 前 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...