小小的聲明
這個結果是我從1991年-2018年的上證、滬深的股票數據分析得來,主要用於學習交流。入市有風險,投資需謹慎。
統計思路
-
獲取數據
上海證券交易所A股股票日線數據,1095支股票,時間區間爲 1999.12.09 至 2016.06.08,前復權,剔除假期休市
深證證券交易所A股股票日線數據,1766支股票,時間區間爲 1999.12.09 至 2016.06.08,前復權,剔除假期休市 -
對每個月的最低開盤價進行統計,取出當月最低價的日期
-
將日期中的天數取出來,用一個長度31的數組進行累計計算
代碼
- 先導入必要的包,定義常量
import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt
from datetime import datetime
# 定義股票文件數據的文件夾路徑
STOCK_LIST_PATH = 'stocklistdata'
# 定義累計天數的數組
COUNT_DAY = [0] * 32
- 讀取和加載文件
def read_stock_list(stocklistpath):
return os.listdir(stocklistpath)
def read_stock_data_from_csv(filepath):
# 第二列是日期,第四列是開盤價,我們數據分析只用到這兩列
return np.loadtxt(filepath, usecols=[2, 4], encoding='gbk', dtype=np.str, delimiter=',')
- 核心處理邏輯
def dealwith_one(filepath):
# 根據文件路徑把數據讀進來
datas = read_stock_data_from_csv(filepath)
# 刪除表頭
datas = np.delete(datas,0,axis=0)
# 轉換成dataframe類型容易計算
df = pd.DataFrame(datas)
#第0列的字符串轉成日期時間類型,方便使用dataframe的API進行操作
df[0] = pd.to_datetime(df[0])
# 新增一列,就是把第0列的日期複製的第2列,爲了方便後面的統計
df[2] = datas[:,0]
# 把第0列設置爲時間索引
df = df.set_index(0)
# 對數據重採樣,取出每個月的最小值並去除nan的行
# 這個時候第2列的日期是不準確的,並不是對應最低價的那一天,所以只有月份是有效的
min_df = df.resample('M').min().dropna(axis=0,how='any')
# 轉換爲list
min_day_old = min_df.values
# 把時間和數據取出來跟當月的數據作比較,如果相等就把當天的日期取出來,對日期進行累計
for data, date in min_day_old:
dt = datetime.strptime(date, "%Y-%m-%d")
values = df[str(dt.year)+'-'+str(dt.month)].values
monthall = df[str(dt.year)+'-'+str(dt.month)].values[:,0]
for i,x in enumerate(monthall):
if x == data:
dt2 = datetime.strptime(values[i][1], "%Y-%m-%d")
COUNT_DAY[dt2.day] += 1
- 最後運行得結果
for f in read_stock_list(STOCK_LIST_PATH):
dealwith_one(STOCK_LIST_PATH + '/'+f)
count_day.pop(0)
- 最後看看結果
很明顯1號2號最低價出現的次數最多,其次是月底28號。
用直方圖來看看