您好,登錄后才能下訂單哦!
這篇“Python量化因子測算與繪圖的代碼怎么寫”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python量化因子測算與繪圖的代碼怎么寫”文章吧。
量化因子的測算通常都是模擬交易,計算各種指標,其中:
測算需要用到的第三方庫:numpy,pandas,talib
繪圖需要用到的第三方庫:matplotlib,seaborn
其他庫隨策略的需要額外添加
這里博主分享自己測算時常使用的流程,希望與大家共同進步!
測算時從因子到收益的整個流程如下:策略(因子組合) -> 買賣信號 -> 買點與賣點 -> 收益
因此我們在測算時,針對每一個個股:
首先這里是常用的一個工具導入,包括測算用的庫與繪圖用的庫(含圖片中文顯示空白解決方案)
# 測算用 import numpy as np import pandas as pd from copy import deepcopy from tqdm import tqdm from datetime import datetime import talib # 繪圖用 import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline # 繪圖現實中文 sns.set() plt.rcParams["figure.figsize"] = (20,10) plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # 當前字體支持中文 plt.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示為方塊的問題 # 其他 import warnings warnings.filterwarnings("ignore")
然后是循環讀取股票的代碼:
import os def readfile(path, limit=None): files = os.listdir(path) file_list = [] for file in files: # 遍歷文件夾 if not os.path.isdir(file): file_list.append(path + '/' + file) if limit: return file_list[:limit] return file_list stock_dict = {} for _file in tqdm(readfile("../data/stock_data")): if not _file.endswith(".pkl"): continue # TODO 這里可以添加篩選,是否需要將當前的股票添加到測算的股票池中 file_df = pd.read_pickle(_file) file_df.set_index(["日期"], inplace=True) file_df.index.name = "" file_df.index = pd.to_datetime(file_df.index) file_df.rename(columns={'開盤':'open',"收盤":"close","最高":"high","最低":"low","成交量":"volume"},inplace=True) stock_code = _file.split("/")[-1].replace(".pkl", '') # TODO 這里可以添加日期,用來截取一部分數據 stock_dict[stock_code] = file_df
上面一部分是處理股票數據,處理后的數據都會保存在 stock_dict 這個變量中,鍵是股票的代碼,值是股票數據
測算指標時,我們以一只股票為例:
for _index,_stock_df in tqdm(stock_dict.items()): measure_df = deepcopy(_stock_df)
代碼中的:
這里的measure_df即要測算的dataframe數據
使用deepcopy是防止測算的過程影響到原始數據
然后我們就可以循環這一個股票的每一行(代表每一天),測算的交易規則如下:
買入規則:買入信號發出&當前沒有持倉,則買入
賣出規則:賣出信號發出&當前有持倉,則賣出
# 開始測算 trade_record_list = [] this_trade:dict = None for _mea_i, _mea_series in measure_df.iterrows(): # 循環每一天 if 發出買入信號: if this_trade is None: # 當前沒有持倉,則買入 this_trade = { "buy_date": _mea_i, "close_record": [_mea_series['close']], } elif 發出賣出信號: if this_trade is not None: # 要執行賣出 this_trade['sell_date'] = _mea_i this_trade['close_record'].append(_mea_series['close']) trade_record_list.append(this_trade) this_trade = None else: if this_trade is not None: # 當前有持倉 this_trade['close_record'].append(_mea_series['close'])
上述代碼中,我們將每一個完整的交易(買->持有->賣),都保存在了trade_record_list變量中,每一個完整的交易都會記錄:
{ 'buy_date': Timestamp('2015-08-31 00:00:00'), # 買入時間 'close_record': [41.1,42.0,40.15,40.65,36.6,32.97], # 收盤價的記錄 'sell_date': Timestamp('2015-10-12 00:00:00')} # 賣出時間 # TODO 也可以添加自定義記錄的指標 }
直接使用 pd.DataFrame(trade_record_list),就可以看到總的交易結果:
整理的過程也相對簡單且獨立,就是循環這個交易,然后計算想要的指標,比如單次交易的年化收益可以使用:
trade_record_df = pd.DataFrame(trade_record_list) for _,_trade_series in trade_record_df.iterrows(): trade_record_df.loc[_i,'年化收益率'] = (_trade_series['close_record'][-1] - _trade_series['close_record'][0])/_trade_series['close_record'][0]/(_trade_series['sell_date'] - _trade_series['buy_date']).days * 365 # 年化收益 # TODO 這里根據自己想要的結果添加更多的測算指標
繪圖的代碼通常比較固定,比如勝率圖:
# 清理繪圖緩存 plt.cla() plt.clf() # 開始繪圖 plt.figure(figsize=(10, 14), dpi=100) # 使用seaborn繪制勝率圖 fig = sns.heatmap(pd.DataFrame(total_measure_record).T.round(2), annot=True, cmap="RdBu_r",center=0.5) plt.title("勝率圖") scatter_fig = fig.get_figure() # 保存到本地 scatter_fig.savefig("勝率圖") scatter_fig.show() # 最后顯示
以上就是關于“Python量化因子測算與繪圖的代碼怎么寫”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。