Python數據分析--Numpy常用函數介紹(6)--Numpy中與股票成交量有關的計算

来源:https://www.cnblogs.com/codingchen/archive/2022/06/07/16350679.html
-Advertisement-
Play Games

成交量(volume)是投資中一個非常重要的變數,它是指在某一時段內具體的交易數,可以在分時圖中繪製,包括日線圖、周線圖、月線圖甚至是5分鐘、30分鐘、60分鐘圖中繪製。 股票市場成交量的變化反映了資金進出市場的情況,成交量是判斷市場走勢的重要指標。一般情況下,成交量大且價格上漲的股票,趨勢向好。成 ...


        成交量(volume)是投資中一個非常重要的變數,它是指在某一時段內具體的交易數,可以在分時圖中繪製,包括日線圖、周線圖、月線圖甚至是5分鐘、30分鐘、60分鐘圖中繪製。

  股票市場成交量的變化反映了資金進出市場的情況,成交量是判斷市場走勢的重要指標。一般情況下,成交量大且價格上漲的股票,趨勢向好。成交量持續低迷時,一般出現在熊市或股票整理階段,市場交易不活躍。成交量是判斷股票走勢的重要依據,對分析主力行為提供了重要的依據。投資者對成交量異常波動的股票應當密切關註。

  OBV(On-Balance Volume,凈額成交量或叫能量潮指標)是最簡單的股價指標之一,它可以由當日收盤價、前一天的收盤價以及當日成交量計算得出。以前一日為基期計算當日的OBV值(可以認為基期的OBV值為0)。若當日收盤價高於前一日收盤價,則本日OBV等於基期OBV加上日成交量。若當日收盤價低於前一日收盤價,則本日OBV等於基期OBV減去當日成交量。若當日收盤價相比前一日沒有變化,則當日成交量以0計算。

一、OBV計算

  鑒於上述計算方法,需要在成交量前面乘上一個由收盤價變化決定的正負號(收盤價低於前一交易日收盤價,負號,收盤價高於前一交易日收盤價,正號)。在本篇中,學習該問題的兩種解決方法,一種是使用NumPy中的 sign 函數,另一種是使用NumPy的piecewise 函數。

1) 把數據分別載入到收盤價和成交量的數組中:

close,vol = np.loadtxt('data036.csv',delimiter=',', usecols=(5,6),converters={1:datestr2num},unpack=True)

data036.csv中的第6列和第7列分別為收盤價和當日成交量。

前篇介紹過numpy.diff()可以計算相鄰的差(即上述收盤價close的差值),並利用這個差值, 用sign 函數計算正負號

changes = np.diff(close)
signs = np.sign(changes)
print ("Signs", signs)

運行結果:

Signs [-1. -1. -1. -1.  1.  1.  1. -1.  1.  1.  1. -1.  1. -1. -1. -1. -1.  1.
  1. -1. -1.  1.  1.  1.  1.  1.  1.  1. -1.  1.  1.  1. -1. -1. -1.  1.
 -1.  1.  1.  1. -1. -1.  1.  1.  1. -1. -1.  1.  1.  1.  1.  1.  1. -1....

2)也可以使用 piecewise 函數來獲取數組元素的正負。 piecewise函數可以分段給定取值。使用合適的返回值和對應的條件調用該函數:

pieces = np.piecewise(changes, [changes < 0, changes > 0], [-1, 1])
print("Pieces", pieces)

3)判斷是否 sign 函數和piecewise 函數計算結果是否一致用array_equal()函數:

print ("Arrays equal?", np.array_equal(signs, pieces))

運行結果:

Arrays equal? True

4)由於diff()y計算的結果是相鄰數據相減,因此得到419個數據,較從文件中導入的數據420個少一位,因此無法計算首日的OBV值

obv_values = vol[1:] * signs          #計算obv值
print("obv values:",obv_values[:20]) #列印前20個obv值

完成代碼如下:

import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt
import sys,os

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

close,vol = np.loadtxt('data036.csv',delimiter=',', usecols=(5,6),converters={1:datestr2num},unpack=True)
#new_close = np.loadtxt('data999.csv',delimiter=',', usecols=(5,),converters={1:datestr2num},unpack=True)

changes = np.diff(close)
signs = np.sign(changes)
print ("Signs", signs[:20])#列印前20個signs值

pieces = np.piecewise(changes, [changes < 0, changes > 0], [-1, 1])
print("Pieces", pieces[:20])#列印前20個pieces值
print ("Arrays equal?", np.array_equal(signs, pieces))

obv_values = vol[1:] * signs          #計算obv值
print("obv values:",obv_values[:20]) #列印前20個obv值

運行結果:

二、 計算單個交易日的利潤

1)讀入數據

將所有交易數據(開盤價、收盤價、最高價、最低價,成交量等)載入到對應的數組中

import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt
import sys,os

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

opens,highs,lows,closes,vols = np.loadtxt('data036.csv',delimiter=',', usecols=(2,3,4,5,6),converters={1:datestr2num},unpack=True) #開盤價、最高價、最低價、收盤價、成交量數組。

2)調用 vectorize 函數並給定calc_profit 函數作為參數:

(1)先定義一個計算利潤的函數:這個函數,是以開盤價買入,以當日收盤價賣出,所獲得的利潤即買入和賣出的差價。事實上,計算相對利潤更為直觀。

def calc_profit(opens, highs, lows, closes):
    buy = opens * 1
    if lows < buy < highs :
        return (closes - buy)/buy
    else:
        return 0

(2)調用 vectorize 函數並給定calc_profit 函數作為參數

func = np.vectorize(calc_profit)
profits=func(opens,highs,lows,closes)

print ("Profits", profits)

3)選擇非零利潤的交易日,並計算平均值:

real_trades = profits[profits != 0]
print ("Number of trades", len(real_trades), round(100.0 * len(real_trades)/len(closes), 2),"%")
print ("Average profit/loss %", round(np.mean(real_trades) * 100, 2))

當然也可以分別計算盈利和虧損:

real_trades = profits[profits > 0]
print ("Number of trades", len(real_trades), round(100.0 * len(real_trades)/len(closes), 2),"%")
print ("平均盈利: %", round(np.mean(real_trades) * 100, 2))

loss_trades = profits[profits < 0]
print ("Number of trades", len(loss_trades), round(100.0 * len(loss_trades)/len(closes), 2),"%")
print ("平均虧損 %", round(np.mean(loss_trades) * 100, 2))

實際運行結果:

三、數據平滑

雜訊數據很難處理,因此需要對其進行平滑處理,除前篇介紹的計算移動平均線的方法,還可以使用NumPy中的一個函數來平滑數據。hanning 函數是一個加權餘弦的窗函數。
1)調用 hanning 函數計算權重,生成一個長度為 N 的視窗(在這個示例中 N 取8)

N=8
weights = np.hanning(N)  #調用hanning 函數計算權重,生成一個長度為8的視窗
print("Weights", weights)

運行結果:

Weights [0.         0.1882551  0.61126047 0.95048443 0.95048443 0.61126047 0.1882551  0.        ]

2)用 convolve 函數計算closes的股票收益率,以歸一化處理後的 weights 作為參數

closes_returns = np.diff(closes) / closes[ : -1] #計算收盤價相鄰差價
smooth_closes = np.convolve(weights/weights.sum(), closes_returns) [N-1:-N+1]#利用權重,計算數據平滑
opens_returns = np.diff(opens) / opens[ : -1] #計算開盤價相鄰差價
smooth_opens = np.convolve(weights/weights.sum(), opens_returns) [N-1:-N+1]

3)用 Matplotlib 繪圖

t = np.arange(N - 1, len(closes_returns))
plt.plot(t, closes_returns[N-1:], lw=1.0)
plt.plot(t, smooth_closes, lw=2.0)
plt.plot(t, opens_returns[N-1:], lw=1.0)
plt.plot(t, smooth_opens, lw=2.0)
plt.show()

運行結果:

4)

如上圖中的折線有交叉,這些交叉點可能就是股價趨勢的轉折點,至少可以表明closes和opens之間的股價關係發生了變化,這些轉折點可能會經常出現,可以利用它們預測未來的股價走勢。

使用多項式擬合平滑後兩組數據,解出的兩個多項式取值相等時(即在哪些地方存在交叉點),這等價於先對兩個多項式函數作差,然後對所得的多項式函數求根。使用 polysub 函數對多項式作差如下:

t = np.arange(N - 1, len(closes_returns))
poly_closes = np.polyfit(t, smooth_closes,N) #求收盤價的多項式
poly_opens = np.polyfit(t, smooth_opens, N)  #求收盤價的多項式
poly_sub = np.polysub(poly_closes, poly_opens)  #polysub函數對多項式作差,
xpoints = np.roots(poly_sub)    #對所得的多項式函數求根
print("Intersection points:", xpoints)

運行結果:

Intersection points: [403.82451866 354.50031142 289.94335284 213.44012464 185.82581983
  97.72837787  51.03724424  18.28586259]

5)用 isreal 函數來判斷數組元素是否為實數,用 select 函數選出它們。 select 函數可根據一組給定的條件,從一組元素中挑選出符合條件的元素並返回數組。

得到的實數交叉點、再去掉其中為0的元素。 trim_zeros 函數可以去掉一維數組中開頭和末尾為0的元素。

reals = np.isreal(xpoints)  #用isreal 函數來判斷數組元素是否為實數
print ("Real number:", reals)

xpoints = np.select([reals], [xpoints]) #select 函數根據一組給定條件,
xpoints = xpoints.real # 從一組元素中挑選出符合條件的元素並返回數組
print("Real intersection points:", xpoints)
print("Sans 0s:", np.trim_zeros(xpoints))#trim_zeros 函數可以去掉一維數組中開頭和末尾為0的元素

運行結果如下:

Intersection points: [403.82451866 354.50031142 289.94335284 213.44012464 185.82581983
  97.72837787  51.03724424  18.28586259]
Real number: [ True  True  True  True  True  True  True  True]
Real intersection points: [403.82451866 354.50031142 289.94335284 213.44012464 185.82581983
  97.72837787  51.03724424  18.28586259]
Sans 0s: [403.82451866 354.50031142 289.94335284 213.44012464 185.82581983
  97.72837787  51.03724424  18.28586259]

完整代碼如下:

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()

opens,highs,lows,closes,vols = np.loadtxt('data036.csv',delimiter=',', usecols=(2,3,4,5,6),converters={1:datestr2num},unpack=True)
#開盤價、最高價、最低價、收盤價、成交量數組。
N=8
weights = np.hanning(N)  #調用hanning 函數計算權重,生成一個長度為8的視窗
print("Weights:", weights)
closes_returns = np.diff(closes) / closes[ : -1] #計算收盤價相鄰差價
smooth_closes = np.convolve(weights/weights.sum(), closes_returns) [N-1:-N+1]#利用權重,計算數據平滑
opens_returns = np.diff(opens) / opens[ : -1]    #計算開盤價相鄰差價
smooth_opens = np.convolve(weights/weights.sum(), opens_returns) [N-1:-N+1]
t = np.arange(N - 1, len(closes_returns))

#多項式擬合平滑後的數據
t = np.arange(N - 1, len(closes_returns))
poly_closes = np.polyfit(t, smooth_closes,N) #求收盤價的多項式
poly_opens = np.polyfit(t, smooth_opens, N)  #求收盤價的多項式
poly_sub = np.polysub(poly_closes, poly_opens)  #polysub函數對多項式作差,
xpoints = np.roots(poly_sub)    #對所得的多項式函數求根
print("Intersection points:", xpoints)

reals = np.isreal(xpoints)  #用isreal 函數來判斷數組元素是否為實數
print ("Real number:", reals)
xpoints = np.select([reals], [xpoints]) #select 函數根據一組給定條件,
xpoints = xpoints.real # 從一組元素中挑選出符合條件的元素並返回數組
print("Real intersection points:", xpoints)
print("Sans 0s:", np.trim_zeros(xpoints))#trim_zeros 函數可以去掉一維數組中開頭和末尾為0的元素

plt.plot(t, closes_returns[N-1:], lw=1.0)
plt.plot(t, smooth_closes, lw=2.0)
plt.plot(t, opens_returns[N-1:], lw=1.0)
plt.plot(t, smooth_opens, lw=2.0)
plt.show()

 


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

-Advertisement-
Play Games
更多相關文章
  • 前端周刊:2022-10 期 前端開發 現在 vue3+vite2 成熟了嗎,可以用在生產環境嗎? Vue3 確實還是有問題 百度統計支持單頁應用啦 單頁應用設置 首個徹底解決緩存和資料庫一致性問題的方案 業務開發中能遇到的問題多數都是工程問題而不是技術問題,前後端都適用 微信公眾號/小程式獲取當前 ...
  • 一、ThreadLocal原理分析 1、概念 ThreadLocal類並不是用來解決多線程環境下的共用變數問題,而是用來提供線程內部的共用變數。在多線程環境 下,可以保證各個線程之間的變數互相隔離、相互獨立。 2、核心原理 即:實際上是ThreadLocal的靜態內部類ThreadLocalMap為 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • """python的拆包和封包之 *號在函數形參和實參的區別1. 在函數形參定義時添加*就是封包過程,封包預設是以元組形式進行封包2. 在函數實參調用過程添加*就是拆包過程,拆包過程中會報列表或者元組拆成單個元素"""subject = ["math", "chinese", 'english', ...
  • 剛剛看到一篇博客,說 stdbind 無法綁定正確的重載函數。這裡的問題並不是 stdbind 能力不足,而是將函數名傳遞給 std::bind 時編譯器無法取到這個函數的地址(也就是符號,編譯器會先解析成符號,鏈接器再替換為地址),因為有多個重載函數都是這個名字。核心問題是無法通過函數名取到想要的 ...
  • Spring Ioc源碼分析系列--自動註入迴圈依賴的處理 前言 前面的文章Spring Ioc源碼分析系列--Bean實例化過程(二)在講解到Spring創建bean出現迴圈依賴的時候並沒有深入去分析了,而是留到了這一篇去分析。為什麼要另起一篇,首先迴圈依賴是個很經典的問題,也是面試屢屢被問到的問 ...
  • 作者:lex-wu 來源:www.cnblogs.com/lex-wu/p/14610110.html 前言 最初是覺得我們打工人,在歷史的浪潮中,我們都被推著上岸。電子產品和移動互聯網,把我們的生活節奏大大提速了,所以很多人都忘記了生活和工作中的關係。 所以在深圳這個城市的各個街道上,都能看到忙忙 ...
  • 整型是我們日常生活中最常用到的基礎數據類型,看這篇文章之前,我想問: 我們真的像自己認為的那麼理解 Java 內的整型嗎? 也許看完本篇文章你就有自己的答案。 C 語言 提供瞭如下的整型 學習 Java 的整型之前,讓我們看看它的前輩——C 語言的實現。 讓我們更好地瞭解它的設計。 數據類型 占用字 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...