天天看點

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

最近自己一直在學習理财相關的東西,是以後面一段時間,可能會多分享一些這方面的學習筆記

其實在學習之前,我一直在思考一個問題:為什麼我們在市場上賺不了錢?可能基金還好點,隻要行情不是特别差,你一直定投總會有多多少少有點收益的,但是其他市場就真不好說了。

觀察了一下身邊的朋友和同僚,其實大多數人都是入門的。比如說有堅信價值投資的,拿着白馬一拿就是好幾年的;也有觀察市場熱點的,追漲殺跌玩的不亦樂乎。但是大家的收益都很一般,甚至虧錢的也不少。

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

是以,我在思考的時候就在想 價值投資和短線熱點 這事。其實價值投資沒有問題,但是拿的太久就是問題;短線熱點也沒有問題,但是沒選對具體的個股基金就是問題。

并且,我自己是研究資料分析的,是不是可以在市場的基礎上加一些資料分析導向的内容?或者是在資料的基礎上,偏向于熱點市場的闆塊?

目前來看,基于上面這個問題的思考,我是有一些小小的收獲的。

但是我也還在學習中,今天的文章甚至後期的文章都隻是一個階段性的學習筆記,不敢說文章的方法适合于所有人。是以大家抄作業的時候也多多思考一下,畢竟方法是我的,但是錢是你的啊!

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

ok,說了些閑話,開始今天的正文。

今天的文章是對一個擇時政策的複現,資料是基于每日大A北上資金進行的。這個政策很簡單的一個應用:當市場處于持續低谷的時候,你可以加大你定投的比例;當市場開始火熱一段時間了,你需要慢慢減少你定投的金額。

就像那句話:在别人貪婪的時候我恐懼,在别人空據的時候我貪婪。

以下是真正的正文:

在文章開始之前,先給大家普及一下北上資金的概念,懂的同學可以跳過去看下一節

北上資金?

在中國股市中有“南北”之稱,一般“北”指的是滬深兩市的股票,“南”指的是香港股票。是以,北上資金就是指從香港股票中流入大陸股市的資金,一般為香港資金以及國際資金。

從曆史資料來看, 不管是長線短線,北上資金都比A股大部分投資者聰明。原因有很多,比如說:可能是外資的投資經驗豐富資訊管道廣,也有可能是内地部分遊資通過北向資金通道進來,也就是換了一層馬甲。

是以,在每天實盤的時候,大家可以關注北向資金的買入情況,偷懶一點的也可以跟着交易。但是但是但是,這裡面有兩個概念特别容易被大家混淆:淨流入和淨買入,其實它的公式很簡單:

                           ​

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!
賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

​​

給大家解釋下,外資每天買賣咱們A股都是有額度限制的,目前滬股通和深股通的額度都是每個交易日 520億,而且是隻要挂單就會占用額度,無論是否成交。

是以,當日資金淨流入會包含當日成交買入額和當日申報但未成交的買單金額,那麼淨流入金額一定會大于或等于淨買入金額,這是兩者最大的差別。

建議大家看北向資金的時候還是要看淨買入金額,因為淨流入金額隻能代表北向資金的一個購買意願,并不能代表真實交易。

常見的,一般 标準的 财經網站你應該會看到下面這種圖:

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!
賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

​但是很多時候你看到的都隻是一個淨流入的資料,并沒有直接顯示淨買入的資料。

其實也不是說這個資料不對,隻是說淨買入資料會更準确些,更能反映目前北上資金的真實情況。這個資料最準确的就是在港交所了,而且是有盤中實時動态播報的,大家可以去了解一下。

說完基礎知識,再來說今天的重點:基于北向資金的擇時政策實作:

其實用一句話就可以解釋所謂的擇時選股政策:基于名額,對指數進行擇時(即判斷指數方向),如果方向向上,就進行選股。

下圖是華泰證券研究所的一篇報告,其中提到了一個基于北上資金的擇時政策。正如文章開頭所說,北上資金目前作為大A的風向标,具有一定的可參考性。

而報告中通過北上資金與滬深300的相關系數,也完美闡釋了這一點:

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

該擇時政策的具體内容是這樣的:

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

政策了解起來很容易,但是怎麼實作呢?

以下源碼拿去即用(除了tushare需要安裝,不過我想這個不用我教了吧),算是開源分享給大家。源碼點這裡擷取

1. 導入相應的庫

# 導入相應的庫
import tushare as ts
import datetime
import pandas as pd
import numpy as np
      

2. 通過接口 token 連結到 tushare

# 将 token 替換成你自己的就行
token = '替換成你自己的token'
pro = ts.pro_api(token)
      

3. 擷取交易日的日期清單

# 擷取所有交易日資料
trade_date = pro.trade_cal(start_date='20180101',end_date=datetime.datetime.today().strftime('%Y%m%d'))
date_list = list(trade_date[trade_date.is_open==1]['cal_date'].values)
      

4. 擷取北上資金的日粒度資料

因為單次請求限制為300條,是以這一步可以分多次擷取

# 單次請求限制為300條,分兩次擷取
df_data1 = pro.moneyflow_hsgt(start_date=date_list[0:300][0], end_date=date_list[0:300][-1])
df_data2 = pro.moneyflow_hsgt(start_date=date_list[300:600][0], end_date=date_list[300:600][-1])
df_data3 = pro.moneyflow_hsgt(start_date=date_list[600:][0], end_date=date_list[600:][-1])
# 合并資料
df_data = df_data1.append([df_data2, df_data3], ignore_index=True)
df_data = df_data.sort_values('trade_date',ascending=True).reset_index(drop=True)
# 重命名
df_data = df_data.rename(columns={'ggt_ss':'港股通-上海', 'ggt_sz':'港股通-深圳', 'hgt':'滬股通', 'sgt':'深股通', 'north_money':'北向資金', 'south_money':'南向資金'})      

資金對應的機關是 百萬,為了友善檢視,這裡需要進行機關的轉換

# 機關換算:百萬->億
df_data['港股通-上海'] = df_data['港股通-上海']*0.01
df_data['港股通-深圳'] = df_data['港股通-深圳']*0.01
df_data['滬股通'] = df_data['滬股通']*0.01
df_data['深股通'] = df_data['深股通']*0.01
df_data['北向資金'] = df_data['北向資金']*0.01
df_data['南向資金'] = df_data['南向資金']*0.01
      

這裡有一點需要注意,因為有個别日期北上資金是無法進行交易的。例如:6月30日-7月1日香港特别行政區紀念日、重陽節、聖誕節等均會有休市情況發生。

是以,有必要剔除掉這些北上資金休市的情況。

觀察資料你會發現,如果根據 北上資金=0 這個條件去篩選,那恰好某一天的買入賣出剛好相等,這種情況也會被過濾掉,這明顯是不合理的。

解決方法:根據 df_data['滬股通'].isna() 字段是否為空進行判斷,代碼如下:

# 剔除北上暫停交易的交易日
df_data2 = df_data.loc[~df_data['滬股通'].isna(), :].reset_index(drop=True)
      

資料處理完畢之後,對應的資料應該是這個樣子的:

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

5. 核心政策實作

再來回顧一下政策的内容:

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

對了,圖中的 252 表示大A一年中的交易日,你沒看錯,就這麼多

​而 1.5 倍标準差則是研報中規定的,至于為什麼選這個數而不是其他 1倍、2倍呢?

研報中也有解釋原因:其中一共選取了10組不同的上下限标注差,并且分别進行了回測,最終 上限+1.5 下限-1.5 的年化收益率最高,達到了 37.54%

ok,既然人家已經都做過了充分的回測,那我們就直接實作拿來用就好

核心代碼如下:

"""周遊每一個交易日,對北上進行分析"""
signal = '無信号'
for index, row in df_data2.iterrows():
    if index<252:
        continue
    df_data_temp = df_data2.iloc[index-252:index]
    # 計算近 252 天的平均數和标準差
    average = df_data_temp['北向資金'].sum()/252
    std = df_data_temp['北向資金'].std()
    # 計算上下限
    up_line = float(format(average + std * 1.5, '.4f'))
    down_line = float(format(average - std * 1.5, '.4f'))
      

以上分别是計算出當天(從資料開始交易日的第252天起)以前 252 天的平均值、标準差、上限和下限

剩下的就是對結果進行判斷和輸出就ok,代碼如下:

# 判斷并輸出
if row['北向資金'] >= up_line:
 signal = '看多'
 print('{0}:<{1}> 北上淨買入:{2}億元,看多線:{3}億元, 看空線:{4}億元'.format(row['trade_date'], signal, format(row['北向資金'], '.4f'), up_line, down_line))
elif row['北向資金'] <= down_line:
 signal = '看空'
 print('{0}:<{1}> 北上淨買入:{2}億元,看多線:{3}億元, 看空線:{4}億元'.format(row['trade_date'], signal, format(row['北向資金'], '.4f'), up_line, down_line))

if index == df_data2.shape[0]-1:
 print('\n最新資料\n{0}: <{1}> \n北上淨買入:{2}億元,看多線:{3}億元, 看空線:{4}億元\n'.format(row['trade_date'], signal, format(row['北向資金'], '.4f'), up_line, down_line))
      

截取了輸出結果的今年的部分,如下圖:

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

可以看到,截止到目前(8月30日收盤),政策給出的觀點是看空,并且是從 7月26日 起就一直看空了,直到今天也是看空階段。

去券商網站上看一下北上資金的曆史資料,圖是這樣的:

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

從7月26号之後的(圖中的紅箭頭)該政策給出的觀點就是看空,但是你仔細看一下研報給的政策條件是,人家說的是:該日北向資金流入規模,而我們通過 tushare 擷取到的是:北向資金的淨買入金額

​​

因為每日的淨流入較淨買入大很多,是以對應的 1.5倍标準差就需要相應的改動一下。

比如說,當你改成 上限+0.8 下限-0.8,它對應的政策是這樣的:

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

賺錢要會理财!Python教你如何正确的購買基金!這年頭誰還沒點基金啊!

當然了,這裡的 0.8 其實是我自己亂改的,并沒有經過回測驗證,在這隻是為了說明對應的資料不同,參數也要有所調整。

感興趣的話大家可以去回測一下淨買入金額對應的不同參數的收益結果,選一個最大的結果對應的參數,然後就可以開啟輕松的定投模式了。

其實,我是有回測出最優參數的,但是擔心你們用我的參數到時候虧錢了輸不起,目前還是不公開出來了。

建議自己多試試,投資本就沒有不勞而獲的東西!或許你的參數收益會比我更優呢!

賺到錢也不用謝我,給我點個贊就行!