自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用Python進(jìn)行交易策略和投資組合分析

開發(fā) 前端
我們將在本文中衡量交易策略的表現(xiàn)。并將開發(fā)一個(gè)簡單的動(dòng)量交易策略,它將使用四種資產(chǎn)類別:債券、股票和房地產(chǎn)。這些資產(chǎn)類別的相關(guān)性很低,這使得它們成為了極佳的風(fēng)險(xiǎn)平衡選擇。

我們將在本文中衡量交易策略的表現(xiàn)。并將開發(fā)一個(gè)簡單的動(dòng)量交易策略,它將使用四種資產(chǎn)類別:債券、股票和房地產(chǎn)。這些資產(chǎn)類別的相關(guān)性很低,這使得它們成為了極佳的風(fēng)險(xiǎn)平衡選擇。

動(dòng)量交易策略

這個(gè)策略是基于動(dòng)量的的,因?yàn)榻灰渍吆屯顿Y者早就意識(shí)到動(dòng)量的影響,這可以在廣泛的市場和時(shí)間框架中看到。所以我們稱之為動(dòng)量策略。趨勢跟蹤或時(shí)間序列動(dòng)量 (TSM) 是在單一工具上使用這些策略的另一個(gè)名稱。我們將創(chuàng)建一個(gè)基本的動(dòng)量策略并在 TCS 上對(duì)其進(jìn)行測試以查看其性能。

TSM策略分析

首先,我們將導(dǎo)入一些庫

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
import ffn
%matplotlib inline

我們構(gòu)建基本的動(dòng)量策略函數(shù)TSMStrategy。函數(shù)將通過時(shí)間序列的對(duì)數(shù)回報(bào)、感興趣的時(shí)間段以及是否允許做空的布爾變量的布爾變量來返回預(yù)期表現(xiàn)。

def TSMStrategy(returns, period=1, shorts=False):
if shorts:
position = returns.rolling(period).mean().map(
lambda x: -1 if x <= 0 else 1)
else:
position = returns.rolling(period).mean().map(
lambda x: 0 if x <= 0 else 1)
performance = position.shift(1) * returns
return performance
ticker = 'TCS'
yftcs = yf.Ticker(ticker)
data = yftcs.history(start='2005-01-01', end='2021-12-31')
returns = np.log(data['Close'] / data['Close'].shift(1)).dropna()
performance = TSMStrategy(returns, period=1, shorts=False).dropna()
years = (performance.index.max() - performance.index.min()).days / 365
perf_cum = np.exp(performance.cumsum())
tot = perf_cum[-1] - 1
ann = perf_cum[-1] ** (1 / years) - 1
vol = performance.std() * np.sqrt(252)
rfr = 0.02
sharpe = (ann - rfr) / vol
print(f"1-day TSM Strategy yields:" +
f"\n\t{tot*100:.2f}% total returns" +
f"\n\t{ann*100:.2f}% annual returns" +
f"\n\t{sharpe:.2f} Sharpe Ratio")
tcs_ret = np.exp(returns.cumsum())
b_tot = tcs_ret[-1] - 1
b_ann = tcs_ret[-1] ** (1 / years) - 1
b_vol = returns.std() * np.sqrt(252)
b_sharpe = (b_ann - rfr) / b_vol
print(f"Baseline Buy-and-Hold Strategy yields:" +
f"\n\t{b_tot*100:.2f}% total returns" +
f"\n\t{b_ann*100:.2f}% annual returns" +
f"\n\t{b_sharpe:.2f} Sharpe Ratio")

函數(shù)輸出如下:

1-day TSM Strategy yields:
-45.15% total returns
-7.10% annual returns
-0.17 Sharpe Ratio
Baseline Buy-and-Hold Strategy yields:
-70.15% total returns
-13.78% annual returns
-0.22 Sharpe Ratio

在合理的年化回報(bào)上,1日TSM策略優(yōu)于買入并持有策略。因?yàn)?1 天的回顧可能包含許多錯(cuò)誤趨勢,所以我們嘗試不同的時(shí)間段來查看它們的比較情況。這里將循環(huán)運(yùn)行模型 3、5、15、30 和 90 天。

 import matplotlib.gridspec as gridspec
periods = [3, 5, 15, 30, 90]
fig = plt.figure(figsize=(12, 10))
gs = fig.add_gridspec(4, 4)
ax0 = fig.add_subplot(gs[:2, :4])
ax1 = fig.add_subplot(gs[2:, :2])
ax2 = fig.add_subplot(gs[2:, 2:])
ax0.plot((np.exp(returns.cumsum()) - 1) * 100, label=ticker, linestyle='-')
perf_dict = {'tot_ret': {'buy_and_hold': (np.exp(returns.sum()) - 1)}}
perf_dict['ann_ret'] = {'buy_and_hold': b_ann}
perf_dict['sharpe'] = {'buy_and_hold': b_sharpe}
for p in periods:
log_perf = TSMStrategy(returns, period=p, shorts=False)
perf = np.exp(log_perf.cumsum())
perf_dict['tot_ret'][p] = (perf[-1] - 1)
ann = (perf[-1] ** (1/years) - 1)
perf_dict['ann_ret'][p] = ann
vol = log_perf.std() * np.sqrt(252)
perf_dict['sharpe'][p] = (ann - rfr) / vol
ax0.plot((perf - 1) * 100, label=f'{p}-Day Mean')

ax0.set_ylabel('Returns (%)')
ax0.set_xlabel('Date')
ax0.set_title('Cumulative Returns')
ax0.grid()
ax0.legend()
_ = [ax1.bar(i, v * 100) for i, v in enumerate(perf_dict['ann_ret'].values())]
ax1.set_xticks([i for i, k in enumerate(perf_dict['ann_ret'])])
ax1.set_xticklabels([f'{k}-Day Mean'
if type(k) is int else ticker for
k in perf_dict['ann_ret'].keys()],
rotation=45)
ax1.grid()
ax1.set_ylabel('Returns (%)')
ax1.set_xlabel('Strategy')
ax1.set_title('Annual Returns')
_ = [ax2.bar(i, v) for i, v in enumerate(perf_dict['sharpe'].values())]
ax2.set_xticks([i for i, k in enumerate(perf_dict['sharpe'])])
ax2.set_xticklabels([f'{k}-Day Mean'
if type(k) is int else ticker for
k in perf_dict['sharpe'].keys()],
rotation=45)
ax2.grid()
ax2.set_ylabel('Sharpe Ratio')
ax2.set_xlabel('Strategy')
ax2.set_title('Sharpe Ratio')
plt.tight_layout()
plt.show()

圖片

通過圖表的結(jié)果,我們可以看到15天的動(dòng)量指標(biāo)提供了最好的結(jié)果。但是,其他時(shí)間周期的結(jié)果是五花八門的。這表明我們這個(gè)策略并不可靠。所以我們還可以通過在接近頂部時(shí)使用止損或追蹤止損來退出交易,而不是在15日線圖下跌或持平時(shí)再進(jìn)行操作。

投資組合分析

到目前為止,我們已經(jīng)用Python創(chuàng)建了一個(gè)交易策略。下面我們將度量并繪制常見的投資組合特征方便我們進(jìn)行觀察分析。

投資組合分析

首先,我們將導(dǎo)入一些重要的庫,并觀察數(shù)據(jù)執(zhí)行情況。

import pandas_datareader.data as web
stocks = ['SPY','GLD','TLT','HYG']

data = web.DataReader(stocks,data_source='yahoo',start='01/01/2019')['Adj Close']
data.sort_index(ascending=True,inplace=True)
perf = data.calc_stats()
perf.plot()

圖片

對(duì)數(shù)回報(bào)

對(duì)數(shù)回報(bào)用于計(jì)算指數(shù)增長率。我們不計(jì)算每個(gè)子時(shí)期的價(jià)格變化百分比,而是計(jì)算那段時(shí)間的自然增長指數(shù)。首先創(chuàng)建一個(gè)df,其中包含數(shù)據(jù)中每個(gè)股票價(jià)格的對(duì)數(shù)回報(bào),然后我們?yōu)槊總€(gè)對(duì)數(shù)回報(bào)創(chuàng)建一個(gè)直方圖。

 returns = data.to_log_returns().dropna()
print(returns.head())


Symbols SPY GLD TLT HYG
Date
2019-01-03 -0.024152 0.009025 0.011315 0.000494
2019-01-04 0.032947 -0.008119 -0.011642 0.016644
2019-01-07 0.007854 0.003453 -0.002953 0.009663
2019-01-08 0.009351 -0.002712 -0.002631 0.006470
2019-01-09 0.004663 0.006398 -0.001566 0.001193

直方圖如下:

ax = returns.hist(figsize=(20, 10),bins=30)

圖片

所有四個(gè)資產(chǎn)類別都顯示正態(tài)分布的直方圖。具有正態(tài)分布的樣本具有算術(shù)平均值和高于和低于平均值的均等分布(正態(tài)分布也稱為高斯分布是對(duì)稱的) 。如果回報(bào)呈正態(tài)分布,預(yù)計(jì)超過 99% 的回報(bào)將落在平均值的三個(gè)標(biāo)準(zhǔn)差范圍內(nèi)。這些鐘形正態(tài)分布特征使分析師和投資者能夠?qū)善钡念A(yù)期收益和風(fēng)險(xiǎn)進(jìn)行更好的統(tǒng)計(jì)推斷。具有鐘形曲線的股票通常是波動(dòng)率低且可預(yù)測的藍(lán)籌股(Blue Chips)。

最大回撤率  DRAWDOWN

DRAWDOWN是指價(jià)值下降到一個(gè)相對(duì)的低谷。這是投資者需要考慮的一個(gè)重要風(fēng)險(xiǎn)因素。讓我們畫一個(gè)遞減策略的可視化表示。

ffn.to_drawdown_series(data).plot(figsize=(15,10))

圖片

這四種資產(chǎn)在2020年上半年都出現(xiàn)了下降,其中SPY的降幅最大,為0.5%。隨后,在2020年上半年,所有資產(chǎn)立即復(fù)蘇。這表明資產(chǎn)回收率很高。這些資產(chǎn)在2020年7月前后見頂。按照這種趨勢,一旦復(fù)蘇達(dá)到頂峰,所有資產(chǎn)類別都出現(xiàn)小幅下跌。根據(jù)結(jié)果TLT將在2022年下半年經(jīng)歷最大的0.5%的下降,然后在2023年初之前恢復(fù)。

MARKOWITZ 均值-方差優(yōu)化

1952年,馬科維茨(MARKOWITZ)提出均值-方差投資組合理論,又稱現(xiàn)代投資組合理論。投資者可以使用這些概念來構(gòu)建基于給定風(fēng)險(xiǎn)水平的最大化預(yù)期回報(bào)的投資組合?;隈R科維茨方法,我們可以生成“最優(yōu)投資組合”。

returns.calc_mean_var_weights().as_format('.2%')
#結(jié)果
SPY 46.60%
GLD 53.40%
TLT 0.00%
HYG 0.00%
dtype: object

相關(guān)性統(tǒng)計(jì)

相關(guān)性是一種統(tǒng)計(jì)方法,用來衡量證券之間的相互關(guān)系。最好使用熱圖來查看這些信息。熱圖可以讓我們看到證券之間的相關(guān)性。

returns.plot_corr_heatmap()

圖片

最好在你的投資組合中擁有相關(guān)性較低的資產(chǎn)。除了SPY與HYG,這四個(gè)資產(chǎn)類別的相關(guān)性都很低,這對(duì)我們的投資組合是不利的:因?yàn)槿绻麚碛懈叨认嚓P(guān)的不同資產(chǎn)組,即使你將風(fēng)險(xiǎn)分散在它們之間,從投資組合構(gòu)建的角度來看,收益也會(huì)很少。

總結(jié)

通過分析和繪制的所有數(shù)據(jù)進(jìn)行資產(chǎn)配置,可以建立一個(gè)投資組合,極大地改變基礎(chǔ)投資的風(fēng)險(xiǎn)特征。還有很多我沒有提到的,但可以幫助我們確定交易策略價(jià)值的起點(diǎn)。我們將在后續(xù)文章中添加更多的技術(shù)性能指標(biāo)。

責(zé)任編輯:華軒 來源: DeepHub IMBA
相關(guān)推薦

2020-05-15 11:02:13

軟件組合應(yīng)用程序開發(fā)

2013-01-09 14:43:38

CA TechnoloGartner云計(jì)算

2021-02-22 13:44:41

開發(fā)Python金融

2014-12-25 09:03:14

CA Technolo

2024-12-13 16:11:01

2021-06-07 09:00:53

Python回測分析Python基礎(chǔ)

2022-11-08 09:39:21

2022-06-24 09:58:35

大數(shù)據(jù)JavaPython

2022-03-30 07:45:41

KyvernoAPI開源項(xiàng)目

2022-03-28 07:33:13

GatekeeperOPA 策略管理CRD

2021-10-22 09:56:09

AI 數(shù)據(jù)人工智能

2024-12-23 07:20:00

2010-07-06 14:35:22

RationalJazz

2021-03-22 11:29:13

加密貨幣比特幣貨幣

2019-05-14 10:37:26

Python機(jī)器學(xué)習(xí)編程語言

2024-07-01 13:51:14

2017-08-19 15:57:08

人工智能機(jī)器人投資

2018-04-26 14:11:44

2021-07-21 16:16:40

PythonNLTK編程語言

2021-09-14 10:20:48

Python股票布林帶
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)