iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0
Python

時空序列分析-關鍵籌碼分析系列 第 3

實作簡單的籌碼分析,資料從哪裡收集? 有資料集還是要自已爬?

  • 分享至 

  • xImage
  •  

突然發現網路上這種東西都被那種大師和財經達人拿來賣課程@@
我們就這樣直接分享出來會不會破壞行情xd

所以籌碼分析到底要怎麼開始? 從別人的文章或是教學來找靈感~

付錢的東西我們還是等有錢了再說,現在台股有辦法免費取得資料的方式有很多管道:


參考了一下,先來做看看這個

雖然是好幾年前的影片和文章了,還是可以借鑑一些內容:

首先要到 證交所的 買賣日報表查詢系統

  1. 輸入你想要查詢的股票代號(證券代號) ex. 2330 (台積電)
    (註. 選鉅額交易會是該交易日當天最大單、最多錢的交易紀錄,所以不會有股票代號讓你輸入)

  2. 輸入輸入圖形中5碼文數字的驗證碼 (如果會寫辨識驗證碼的程式,也是可以把這過程也自動化)

https://ithelp.ithome.com.tw/upload/images/20240803/20168322iPWvFdyTfE.png

https://ithelp.ithome.com.tw/upload/images/20240803/20168322hg5IOBYTnp.png

  1. 按那個 "下載2330 CSV" ,就可以獲得一份CSV檔 (如下圖)
    https://ithelp.ithome.com.tw/upload/images/20240803/20168322GLIEoVo0vb.png

拿到資料後,要來做資料清理和前處理了~

基於資料庫欄位的獨一性,那個並排的欄位和資料就不太OK~
如果在看文章的你不是資訊背景出身,可以參考一下網路上針對資料庫的一些基礎知識教學
(不然會有點霧煞煞,心裡想:為甚麼不行?? 蛤阿,好麻煩哦?)
像是 資料庫( SQL ) 建立表格 欄位介紹

我都直接把右邊並排的資料用工人智慧剪貼到左邊下面,懶得寫程式(誤
接著把欄位"序號"刪掉,用不到。


因為前陣子的紅海危機(這陣子好像又來了),讓航運類股噴了一小段行情,

下面就用那時候收集 2609 陽明,5/13的交易資料 來繼續實作。

# TEST 讀取資料

data = pd.read_csv("E:/時空資料分析/關鍵分點籌碼分析_實測/files_ss/2609_20240513.csv",encoding='cp950',sep=',')
#記得要把檔案的路徑改成你的

#sep=',',
#header=None
#sep='delimiter'
data    

*(註. 這邊debug了一段時間,後面的cp950和下面的註解就是血淋淋的成果)
*(註. 沒辦法執行或出bug的時候會很煩,現在有chatGPT後,很多stackoverflow上解不開的問題都可以解開)

得到以下輸出:

券商 價格 買進股數 賣出股數
0 1020合  庫 64.5 0 4000
1 1020合  庫 64.9 1000 0
2 1020合  庫 65.4 1000 0
3 1020合  庫 65.6 1000 52000
4 1020合  庫 65.8 2000 0
... ... ... ... ...
11135 9A9Z永豐復興 65.4 0 1000
11136 9A9Z永豐復興 65.8 0 1000
11137 9A9Z永豐復興 66.2 0 4000
11138 9A9Z永豐復興 66.4 0 2150
11139 9A9Z永豐復興 66.6 35000 40418
11140 rows × 4 columns

會發現 每個 券商 在很多價位都有買賣,

把數字視覺化做成圖表看看

畫出長條圖

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import seaborn as sns

# 設定圖表字體,這邊我研究很久,好不容易讓中文可以在圖上顯示
zhfont = fm.FontProperties(fname=r'C:\Windows\Fonts\kaiu.ttf')  # 使用原始字串
plt.rcParams['font.family'] = zhfont.get_name()

# 資料表保存在 'data.csv' 檔案中
data = pd.read_csv('E:/時空資料分析/關鍵分點籌碼分析_實測/files_ss/2609_20240513.csv',encoding='cp950',sep=',')


# 假設資料表包含 '券商', '買進股數', '賣出股數' 三列
# 需要調整以下代碼以適應實際資料表結構
# 計算買賣超 = 買進股數 - 賣出股數
data['買賣超'] = data['買進股數'] - data['賣出股數']

# 按照券商分組,計算每個券商的總買賣超
grouped_data = data.groupby('券商')['買賣超'].sum().reset_index()

# 按買賣超排序,方便繪圖時顯示效果更好
grouped_data = grouped_data.sort_values(by='買賣超', ascending=False)
grouped_data["買賣超"] = grouped_data["買賣超"] /1000 # 1張=1000股,把股數轉換成張數

# 設定圖表大小
plt.figure(figsize=(10, 8))

# 繪製條形圖
sns.barplot(x='買賣超', y='券商', data=grouped_data, palette='coolwarm')

# 添加標題和標籤
plt.title('2609 陽明 各券商買賣超資訊', fontproperties=zhfont)
plt.xlabel('買賣超 (張數)', fontproperties=zhfont)
plt.ylabel('券商', fontproperties=zhfont)

# 顯示圖表
plt.show()

成功的話會出現這樣一張圖,

https://ithelp.ithome.com.tw/upload/images/20240803/20168322mP2VeRblDL.png


但...有沒有發現,黑壓壓的一片?
因為資料太多,字都疊在一起,也根本看不懂。
先把價格放一邊,只保留 買進張數、賣出張數

這時候限縮一下範圍,解決閱讀性的問題

列出前20名買超

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 按買賣超排序,選取前 20 名
top_20 = grouped_data.sort_values(by='買賣超', ascending=False).head(20)

# 設定圖表大小
plt.figure(figsize=(12, 8))

# 繪製條形圖
sns.barplot(x='買賣超', y='券商', data=top_20, palette='coolwarm')

# 添加標題和標籤
plt.title('2609 陽明 各券商買賣超資訊 (買超前20名)')
plt.xlabel('買賣超 (張數)')
plt.ylabel('券商')

# 調整標籤的字體大小
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)

# 顯示圖表
plt.show()

https://ithelp.ithome.com.tw/upload/images/20240803/20168322ulx8CVjuGY.png

選買賣超後20名(tail,尾巴),當然就是賣超囉!

# 按買賣超排序,選取後 20 名  #賣超
tail_20 = grouped_data.sort_values(by='買賣超', ascending=False).tail(20)

https://ithelp.ithome.com.tw/upload/images/20240803/20168322gmlNe1CMwZ.png

接下來嘗試把每個券商買賣的不同價格也放進來

獲取各個券商購買股票的價格和買賣超資訊,並整合後繪製成圖表

用長條圖+折線圖顯示買超前20名,看起來很直觀

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.font_manager as fm

# 設定字體
zhfont = fm.FontProperties(fname=r'C:\Windows\Fonts\kaiu.ttf')  # 使用原始字串
plt.rcParams['font.family'] = zhfont.get_name()

# 資料表保存在 'data.csv' 檔案中
data = pd.read_csv('E:/時空資料分析/關鍵分點籌碼分析_實測/files_ss/2609_20240513.csv',encoding='cp950',sep=',')

# 確認數據表的列名
print(data.columns)

# 假設數據表包含 '券商', '分點', '買進股數', '賣出股數', '價格' 等列
# 計算買賣超
data['買賣超'] = data['買進股數'] - data['賣出股數']

#變成張數
data["買賣超"] = data["買賣超"] /1000

# 計算每個券商的總買賣超
total_buy_sell_diff = data.groupby('券商')['買賣超'].sum().reset_index()

# 計算每個券商的平均買入價格
average_buy_price = data.groupby('券商').apply(lambda x: (x['買進股數'] * x['價格']).sum() / x['買進股數'].sum()).reset_index()
average_buy_price.columns = ['券商', '平均買入價格']

# 合併買賣超和平均買入價格數據
merged_data = pd.merge(total_buy_sell_diff, average_buy_price, on='券商')

# 按買賣超排序,選取前 20 名
top_20 = merged_data.sort_values(by='買賣超', ascending=False).head(20)

# 設定圖表大小
fig, ax1 = plt.subplots(figsize=(14, 8))

# 繪製買賣超條形圖
bar = ax1.bar(top_20['券商'], top_20['買賣超'],color='lavender', label='買賣超')
#color='light lavender'(#dfc5fe)


# 添加標題和標籤
ax1.set_xlabel('券商',fontsize="12")
#ax.set_xticklabels(categories, rotation=45, ha='right')

ax1.set_ylabel('買賣超 (張數)',fontsize="12")
ax1.set_title('前 20 名券商 買超 資訊及平均價格',fontsize="16")
ax1.tick_params(axis='x', rotation=45)  #讓下面的X軸資料字體不疊在一起,斜45度

# 創建第二個y軸
ax2 = ax1.twinx()
line = ax2.plot(top_20['券商'], top_20['平均買入價格'], color='r', marker='o', label='平均買入價格')
ax2.set_ylabel('平均買入價格 (元)',fontproperties=zhfont)

# 添加圖例 (右上角那個小小的方框)
bars = [bar]
lines = [line[0]]
ax1.legend(bars + lines, [bar.get_label() for bar in bars] + [line.get_label() for line in lines])

# 顯示圖表
plt.tight_layout()
plt.show()

https://ithelp.ithome.com.tw/upload/images/20240803/20168322dcZHFvlHL3.png

比較喜歡看數字,也可以直接看
top_20

券商 買賣超 平均買入價格
71 1650瑞銀 9476.000 66.025881
69 1570港商法興 8637.000 66.172722
64 1380台灣匯立 7945.000 65.986130
65 1440美林 5337.000 66.100368
517 9268凱基台北 4658.416 66.343176
462 9200凱基 4226.445 66.595545
700 983U元大頭份 2553.941 66.115936
184 592Z元富安南 1904.160 66.443186
66 1470台灣摩根 1576.000 66.014743
485 9216凱基信義 1215.711 66.559148
746 9897元大土城 1162.650 66.110275
688 982F元大忠鼎 1037.500 66.567083
774 989j元大樹林 964.665 66.263047
396 8880國泰綜合 942.181 66.286631
407 8890大和國泰 930.000 66.150538
573 9600富邦 881.926 66.586528
618 9666富邦南屯 808.921 66.537988
213 6161中信三重 752.050 66.272246
580 961H富邦新板 725.583 66.546356
67 1480美商高盛 603.000 66.338141

賣超前20名

# 按買賣超排序,選取後 20 名
tail_20 = merged_data.sort_values(by='買賣超', ascending=False).tail(20)

# 設定圖表大小
fig, ax1 = plt.subplots(figsize=(14, 8))

# 繪製買賣超條形圖
bar = ax1.bar(tail_20['券商'], tail_20['買賣超'],color='beige', label='買賣超')
#color='light lavender'(#dfc5fe)


# 添加標題和標籤
ax1.set_xlabel('券商')
ax1.set_ylabel('買賣超 (張數)')
ax1.set_title('前 20 名券商 賣超 資訊及平均價格')
ax1.tick_params(axis='x', rotation=45)

# 創建第二個y軸
ax2 = ax1.twinx()
line = ax2.plot(tail_20['券商'], tail_20['平均買入價格'], color='g', marker='o', label='平均賣出價格')
ax2.set_ylabel('平均賣出價格 (元)',fontproperties=zhfont)

# 添加圖例
bars = [bar]
lines = [line[0]]
ax1.legend(bars + lines, [bar.get_label() for bar in bars] + [line.get_label() for line in lines])

# 顯示圖表
plt.tight_layout()
plt.show()

https://ithelp.ithome.com.tw/upload/images/20240803/20168322WxEQqiT3au.png

以上就能靠自己做到簡單的籌碼分析了哦! 而且你還知道券商的平均價格~

(這些券商APP也是可以查到,不過若是靠自己將這些流程自動化,
後續自己做策略,就可以不用開APP在那邊按了)

明天繼續,各位晚安!


每日記錄:
其實自己有點拖延症,看到有人在看自己的文章很開心也很驚訝,想要偷偷的寫文章度過三十天,
但是又會擔心自己亂教東西給大家(不想分享不實用的東西), by 一邊小內耗一邊前進著的I人。
文章內容幾乎都是一個字一個字打的,因為覺得用chatGPT很敷衍,一眼就看得出來了,
如果可以把內容用白話一點、簡單一點的方式讓別人學會,何不美哉(對自己的小要求)

然後原本文章打到一半,按到其他網頁跳轉,內容沒存到又重打了RRR
這個寫文章好搞剛..,上傳圖片還要把網頁移到最上面去按按鈕,傳完再回來繼續寫文章(吐血

歡迎來打招呼、問問題,按按讚~ 謝謝~
/images/emoticon/emoticon41.gif


上一篇
關鍵分點,籌碼分析的核心概念? 怎麼運用在時空序列分析上?
下一篇
題目的靈感來源? 其他人都是怎麼做股票分析的?
系列文
時空序列分析-關鍵籌碼分析31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言