基金虧到底了?那就來分析一下如何合理投資吧

前言

其實有點標題黨了,這篇博客主要是想分享一下我最近的一次數據挖掘作業,如何爲基金定投制定合理的策略。最近在投資基金的人應該也知道,這兩週的雞可謂是慘不忍睹,有的基金一兩天就把之前賺的全虧沒了(原油基金有人準備抄底的嗎,哈哈哈)。所以這次好好的來分析一下定投策略還是很有必要的。
在這裏插入圖片描述
在這裏插入圖片描述

開始分析

1.首先還是老規矩,導庫導數據

數據是由老師給的接口得到的滬深300指數基金的數據,把url稍微改一下然後下載對應的csv就得到數據啦。

import pandas as pd
import numpy as np
import matplotlib
from datetime import datetime,timedelta,date
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif']='FangSong'
plt.rcParams['axes.unicode_minus']=False

# 導入我們下載好的滬深300基金數據集
data=pd.read_csv('./000300.csv',encoding='gbk')
data.info()
data.head()

在這裏插入圖片描述

#查看數據集是否有缺失值
data.isnull().sum()

在這裏插入圖片描述

2.數據預處理

# 將日期列變爲datetime類型
data['日期']=pd.to_datetime(data['日期'])
data['日期']=data['日期'].apply(lambda x:datetime.strftime(x,'%Y-%m-%d'))
data.info()
data.head()

在這裏插入圖片描述

3.簡單可視化一下近期行情

plt.figure(figsize=(10,8))
ax=data[:100].plot('日期','最高價',kind='line',color='red',label="最高價")
data[:100].plot('日期','最低價',kind='line',color='green',label="最低價",ax=ax)
plt.title("近期基金價格曲線圖")
plt.xlabel("日期")
plt.ylabel("價格")
plt.legend()
plt.show()

在這裏插入圖片描述

4.正式開始解決任務

任務1:假設定投的金額是500元,每週定投一次,據此計算2019年對滬深300指數基金進行定投的收益率

# 首先來分析一下這個問題怎麼設計函數,首先需要數據,每次定投的金額、定投週期、定投開始結束時間作爲參數
# 然後計算,返回結束時的總投資金額以及總利潤,從而計算得到收益率,開始寫函數
# 在這裏基金價格我以收盤價計算
def invest1(data,start,end,aip,T):
    startday=datetime.strptime(start,'%Y-%m-%d').date()
    endday=datetime.strptime(end,'%Y-%m-%d').date()
    curr=startday
    
    total_aip=0  #總的定投金額
    total_profit=0  #總利潤
    total_count=0  #總的基金數
    final_price=0  #最後的基金價格
    while curr<endday:   
        while str(curr) not in data['日期'].values:
            curr+=timedelta(days=1)
            if curr in data['日期'].values:
                break
                
        count=aip/float(data[data['日期']==str(curr)]['收盤價'].values[0])
        total_count+=count
        total_aip+=aip
        #print(f"時間:{curr},擁有的基金總數:{total_count}")
        curr+=timedelta(days=T)
    final_price=float(data[data['日期']==str(curr)]['收盤價'].values[0])
    total_profit=final_price*total_count-total_aip
    return total_aip,total_profit
 
    
#定投500,每週定投利潤率
total_aip1,total_profit1=invest1(data,'2019-01-03','2020-01-03',500,7)
print(f"2019年每週定投500方案的總投資爲:{total_aip1},總利潤爲:{total_profit1}")
profit_rate1=total_profit1/total_aip1

print(f"2019年每週定投500方案的收益率爲:{profit_rate1*100}%")

在這裏插入圖片描述
2019年每週定投500的收益率爲11.424%

任務2.假設定投的金額是500元,每週定投一次,據此分別計算從2002年開始到2019年,每年定投滬深300指數基金的收益率並將結果可視化

有了第一問的函數,第二問就很簡單啦,只要循環調用這個函數就行,設置開始結束時間就用datetime.date()來設置就好啦

#可以調用問題1的函數,只不過這次我們需要把每次的收益率給存到列表中
def get_allressult():
    for i in range(2002,2020):
        start=date(i,1,4)
        end=date(i+1,1,4)
        a,b=invest1(data,str(start),str(end),500,7)
        profit_rate=b/a
        yield profit_rate

def plot_res():
    results=[]
    for i in get_allressult():
        results.append(i)
    plt.figure(figsize=(10,6))
    plt.plot([i for i in range(2002,2020)],results,color='r',label="收益率曲線")
    plt.title('2002-2019歷年利潤率曲線圖')
    plt.legend()
    plt.xticks([i for i in range(2002,2020)],[i for i in range(2002,2020)])
    plt.xlabel("年份")
    plt.ylabel("利潤率")
    plt.show()

plot_res()   

在這裏插入圖片描述
可以看到大多數年份收益率在-0.2到0.2之間,只有少數年份的收益率能達到0.6甚至更高。

任務3:探索不同的定投策略,看看你能否得到更好的定投收益呢?

想解決這個問題,我們可以像傻瓜一樣去嘗試所有方法,也可以從現實角度出發,想出儘量合理可行的投資計劃再來編寫相應的程序探索結果

那什麼樣的投資方法纔是能使收益率最高(或者說最大化收益的方法呢),考慮下面的一些現實情況

  • 定投週期是不是可以改變?變長或變短有沒有影響?
  • 當買入成本越低的時候,我們買入收益纔會變高
  • 當買入成本低的時候多買入,高的時候少買或者不買
  • 當我們的收益下跌的時候是否繼續買入?
  • 當收益下跌時我們是增加買入還是減少買入

所以從上面的問題出發,首先要通過試驗得到一些結論:最好的定投週期、最好的定投金額

# 開始測試最好的週期(拿2019年數據測試)
def test1():
    res=[]
    T=[2,7,14,21]
    for i in T:
        a,b=invest1(data,'2019-01-05','2020-01-05',500,i)
        res.append(b/a)
    print(f"週期爲{T}的收益率分別爲:",res)
test1()

在這裏插入圖片描述
貌似兩週一次定投是可以使收益率最大化的選擇

# 再來試試最好的定投金額
def test2():
    res=[]
    money=[300,500,700,1000]
    for i in money:
        a,b=invest1(data,'2019-01-03','2020-01-03',i,14)
        res.append(b/a)
    print(f"定投金額爲{money}的收益率分別爲:",res)
test2()

在這裏插入圖片描述
定投金額貌似對基金的收益率影響微乎其微

現在,有了上面的兩個結論,我們知道設置爲兩週一次定投獲益最大,而且定投金額影響不大,只是700元稍稍高一點點點(多個點,表示影響真的不大)

那再來試着想想策略:

  1. 當基金跌(漲跌幅爲負)的時候買入;當基金漲的時候部分賣出,防止牛市回吐。
  2. 設置一個止盈點,幫助我們及時退出,不會碰到基金低谷導致全虧回去。這個時候我們可以提出錢,然後繼續定投,由於我們賺了錢,所以這個時候投資金額和週期都可以變化一下。
  3. 去研究一下經濟學投資規律,看有沒有什麼好的數學模型可以借用。

然後去知網等網站查了相關的文獻,得到了一些有啓發的信息。
比如賣出金額函數模型:



這部分相關的論文文獻資料有很多,看了之後會很有啓發的。
好,回到我們的制定策略上來。通過上面的分析還有看了這些文章的結論,都反映一個問題,跌的時候買入,設置止損,並且定投金額要隨時變化

但是我們怎麼做到底部買入並且還能控制定投金額變化呢,這就需要我們的定投金額與我們的收益率之間存在某種函數關係:

=(1+α)定投金額=固定金額*(1+\alpha收益率)

對於這個公式,我們收益時就可以減少買入,也就相當於限制了收益率;而虧損時會追加買入,符合底部買入的思想,現在就是找找最合適的α\alpha是多少了

#我們制定的定投策略
def invest2(data,start,end,aip,T,alpha):
    startday=datetime.strptime(start,'%Y-%m-%d').date()
    endday=datetime.strptime(end,'%Y-%m-%d').date()
    curr=startday
    
    total_aip=0  #總的定投金額
    total_profit=0  #總利潤
    total_count=0  #總的基金數
    final_price=0  #最後的基金價格
    while curr<endday:   
        while str(curr) not in data['日期'].values:
            curr+=timedelta(days=1)
            if curr in data['日期'].values:
                break
        last=float(data[data['日期']==str(curr)]['收盤價'].values[0])    
        count=aip/float(data[data['日期']==str(curr)]['收盤價'].values[0])
        total_count+=count
        total_aip+=aip
        total_profit=last*total_count-total_aip
        total_rate=total_profit/total_aip
        #print(f"時間:{curr},擁有的基金總數:{total_count}")
        curr+=timedelta(days=T)
        aip=aip*(1-total_rate*alpha)
    return total_aip,total_profit

# 固定金額設爲700(定投金額隨獲益率變化),每週定投一次
total_aip21,total_profit21=invest2(data,'2018-01-02','2019-01-02',700,7,0.1)
print(f"2018年每週定投金額變動方案的總投資爲:{total_aip21},總利潤爲:{total_profit21}")
profit_rate21=total_profit21/total_aip21
print(f"2018年每週定投金額變動方案的收益率爲:{profit_rate21*100}%")

在這裏插入圖片描述
當我們滿懷期待想看收益的時候,現實潑了一盆涼水,納尼?2018-2019基金定投收益率是負的,一直虧???

我冷靜了一下,又回去看了一下之前可視化的圖(2002-2019歷年利潤變化的圖),發現2018年收益率就是負的。現在就有兩種選擇:

第一,2018買入一直放到2020,看看結果如何。

第二,直接放棄2018買入(或者2018年部分時間買入),然後等2019年再買

同樣的,試試這兩種策略的結果

# 2018買入一直放到2020
total_aip,total_profit=invest2(data,'2018-01-02','2020-01-02',700,7,1)
print(f"2018年到2020每週定投金額變動方案的總投資爲:{total_aip},總利潤爲:{total_profit}")
profit_rate=total_profit/total_aip
print(f"2018年到2020每週定投金額變動方案的收益率爲:{profit_rate*100}%")

# 改變一下alpha看還能不能優化
def test3():
    alpha=[0.1,0.2,0.4,0.6,0.8,0.9,1]
    for i in alpha:
        total_aip,total_profit=invest2(data,'2018-01-02','2020-01-02',700,7,i)
        profit_rate=total_profit/total_aip
        print(f"alpha爲{i}時,2018年到2020每週定投金額變動方案的收益率爲:{profit_rate*100}%")
test3()

在這裏插入圖片描述
最好的alpha好像是1,說明見好就收(賺了錢就跑)還是有一定道理的

# 再來試試2018部分時間買入,2019全年定投的結果
def test4():
    total_aip1,total_profit1=invest2(data,'2018-02-02','2018-04-02',700,7,1)
    profit_rate1=total_profit1/total_aip1
    total_aip2,total_profit2=invest2(data,'2019-01-02','2020-01-02',700,7,1)
    profit_rate2=total_profit2/total_aip2
    profit_rate=(profit_rate1+profit_rate2)/2
    print(f"alpha爲1時,2018年部分時間定投2019到2020每週定投金額變動方案的收益率爲:{profit_rate*100}%")
test4() 

在這裏插入圖片描述

def test5():
    total_aip,total_profit=invest2(data,'2019-01-02','2020-01-02',700,7,1)
    profit_rate=total_profit/total_aip
    print(f"alpha爲{1}時,2019年到2020每週定投金額變動方案的收益率爲:{profit_rate*100}%")
test5()

在這裏插入圖片描述

4.總結:

最終的策略是2018-2020一直定投,定投週期爲一週,定投金額爲:
700*(1-α\alpha*目前的總收益率),其中α\alpha最好的取值爲1

在2018-2020得到的最大收益率爲20.4%

不足與改進:

不足之處在於我對金融投資的瞭解還不夠,可能想到的影響因素沒有很全面。當然對於基金投資來說本來就是有風險的事,想要穩賺不賠還是很難的。

改進:我也想過用svr或者神經網絡對模型進行擬合預測,找到什麼時候是最低價,然後買入,什麼時候是最高價然後全部賣出。但是這樣太理想化,對於數據集我們是從未來看過去的事,換句話說,我們只要對數據漲跌幅排個序,然後找到最低價的時候買入,最高價的時候賣出,這個時候的收益率肯定是最大的,但是這個還是定投嗎?當一個事後諸葛亮應該不是這次數據分析的目的,所以還是應該想一種定投策略可以使它對於未來的定投有指導作用,那麼 =(1+α)定投金額=固定金額*(1+\alpha收益率) 這個策略對定投就很有幫助。

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