大數據告訴我基金定投日應該設置在1、2號(附代碼)

小小的聲明

這個結果是我從1991年-2018年的上證、滬深的股票數據分析得來,主要用於學習交流。入市有風險,投資需謹慎。

統計思路

代碼

  • 先導入必要的包,定義常量
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號。

用直方圖來看看
直方圖,最低價分佈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章