生活随笔
收集整理的這篇文章主要介紹了
简单布林带策略实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡單布林帶策略實現
ID:383995
import pandas as pd
import matplotlib.pyplot as plt
import warnings
import tushare as ts
import seaborn as sns
sns.set()
warnings.simplefilter("ignore")# 數據日期參數設置
start_time = '20180701'
end_time = '20190401'
initial_account = 1000000
# 布林帶參數
N = 20# 導入股票數據
def get_ts_api():return ts.pro_api("your token here")def get_index_data(start, end):pro = get_ts_api()index_data = pro.index_daily(ts_code='000300.SH', start_date=start, end_date=end)return index_data# 指標計算
# md=N日內的收盤價之和÷N
# md=平方根N日的(C-MA)的兩次方之和除以N
# mb=N日的ma
# up=MB+2×md
# dn=MB-2×md
def calculate_boll(start, end):index_data = get_index_data(start, end)index_data.sort_index(ascending=False, inplace=True)df = index_data[['trade_date', 'open', 'close', 'high', 'low']]df['trade_date'] = pd.to_datetime(df['trade_date'], format="%Y%m%d")df.set_index('trade_date', drop=True, inplace=True)# 移動平均線和方差的計算ma = df['close'].rolling(N).mean()md = df['close'].rolling(N).std()# Boll帶相關指標的計算mb = ma.copy()up = mb+2*mddn = mb-2*mddf['Boll_up'] = updf['Boll_down'] = dndf['Boll_mid'] = mbreturn df# 策略開發
# 當Boll價格向上突破中軌時,增加持倉;當Boll價格突破上軌時,全倉殺入
# 當Boll價格向下突破中軌時,減少持倉;當Boll價格突破下軌時,全倉賣出# 參數解釋
# up_status:價格是否向上突破上軌,取值為2,0
# down_status: 價格是否向下突破下軌,取值分別為-2,0
# mid_status:價格是否向上或向下穿過中軌,取值分別為1,-1,0
# status: 將以上參數相加,得到全倉殺入、買入100、賣出100、全倉殺出信號分別為2,1,-1,-2,不交易信號為0
def get_status(start, end):df = calculate_boll(start, end)up_status = pd.DataFrame(index=df.index, columns=['up_status'])up_status[(df['close'].shift(1) < df['Boll_up'].shift(1)) & (df['close'] > df['Boll_up'])] = 2up_status.fillna(0, inplace=True)down_status = pd.DataFrame(index=df.index, columns=['down_status'])down_status[(df['close'].shift(1) > df['Boll_down'].shift(1)) & (df['close'] < df['Boll_down'])] = -2down_status.fillna(0, inplace=True)mid_status = pd.DataFrame(index=df.index, columns=['mid_status'])mid_status[(df['close'].shift(1) < df['Boll_mid'].shift(1)) & (df['close'] > df['Boll_mid'])] = 1mid_status[(df['close'].shift(1) > df['Boll_mid'].shift(1)) & (df['close'] < df['Boll_mid'])] = -1mid_status.fillna(0, inplace=True)df['status'] = up_status['up_status']+down_status['down_status']+mid_status['mid_status']df.dropna(inplace=True)return dfclass CapitalInfo:account = initial_account ?# 賬戶金額quantity = 0 ?# 持有股票數# 只買賣100股
def buy(c, price):if c.account > price*100:c.account -= price*100 ?# 每次買100股c.quantity += 100return cdef sell(c, price):if c.quantity > 100:c.account += price*100 ?# 每次賣200股c.quantity -= 100return c# 全倉殺入殺出
def buy_all(c, price):q = 100*int(c.account/(price*100))if q > 0:c.account -= q*pricec.quantity += qreturn cdef sell_all(c, price):if c.quantity > 0:c.account += c.quantity*pricec.quantity = 0return cdef get_strategy_data(start, end, init):c = CapitalInfo()strategy_data = get_status(start, end)# 賬戶初始化c = buy(c, strategy_data['close'][0])strategy = pd.DataFrame(index=strategy_data.index, columns=['strategy'])strategy.iloc[0, 0] = c.account+c.quantity * strategy_data['close'][0]# 遍歷每個交易日進行交易# 全倉殺入殺出for i in strategy_data.index:if strategy_data.loc[i, 'status'] == 2:c = buy_all(c, strategy_data.loc[i, 'close'])if strategy_data.loc[i, 'status'] == 1:c = buy(c, strategy_data.loc[i, 'close'])if strategy_data.loc[i, 'status'] == -1:c = sell(c, strategy_data.loc[i, 'close'])if strategy_data.loc[i, 'status'] == -2:c = sell_all(c, strategy_data.loc[i, 'close'])strategy.loc[i, 'strategy'] = c.account+c.quantity * strategy_data.loc[i, 'close']strategy_data = pd.concat([strategy_data, strategy], axis=1)strategy_data['strategy_revenue'] = (strategy_data['strategy']-init)/initstrategy_data['benchmark'] = (strategy_data['close']-strategy_data['close'][0])/strategy_data['close'][0]return strategy_datadef main(start, end, init):strategy_data = get_strategy_data(start, end, init)plt.figure(figsize=(20, 15))plt.plot(strategy_data['strategy_revenue'], 'r-')plt.plot(strategy_data['benchmark'], 'b-')plt.legend(['strategy', 'HS300'])plt.xlabel('Date')plt.ylabel('Revenue')plt.title("Boll_strategy")plt.show()
總結
以上是生活随笔為你收集整理的简单布林带策略实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。