搞一个简单的交易策略回测(难点的我也不会啊)。此策略基于布林通道,当股价低于布林通道下轨线且持仓为0时,以下轨线价格全仓买入(不关心风险,反正也不要本钱)。当股价突破布林线上轨且有持仓时,以上轨线价格清仓卖出。(期间也没有考虑交易的费用)
首先,从MySQL数据库读取已经下载好的股票历史数据,我用的库名是stock_databases。股票就随便选一个。
from sqlalchemy import create_engine
import pandas as pd
def calculate_boll(code):
# 用于数据读取的表字段
columns = 'date, open, high, low, close, volume'
# 连接数据库引擎对象
engine = create_engine("mysql+pymysql://root:123456@localhost:3306/stock_databases?charset=utf8")
# 读取数据
df = pd.read_sql('SELECT {} FROM {}_{}'.format(columns, code[:2], code[3:]),
con=engine,index_col='date')
print(df.info())
calculate_boll('sh.600478')
读取的数据如下图
数据类型在我保存到数据库之前就做了相应的处理,接着计算布林通道:
from sqlalchemy import create_engine
import pandas as pd
def calculate_boll(code):
# 用于数据读取的表字段
columns = 'date, open, high, low, close, volume'
# 连接数据库引擎对象
engine = create_engine("mysql+pymysql://root:123456@localhost:3306/stock_databases?charset=utf8")
# 读取数据
df = pd.read_sql('SELECT {} FROM {}_{}'.format(columns, code[:2], code[3:]),
con=engine,index_col='date')
# 计算标准差
standard_deviations = df['close'].rolling(20).std(ddof=1)
# 添加布林通道的上轨、下轨和中轨
df['md'] = round(df['close'].rolling(20).mean(), 2)
df['upper'] = round(df['md'] + 2 * standard_deviations, 2)
df['lower'] = round(df['md'] - 2 * standard_deviations, 2)
return df
有了布林通道的数据后,就可以通过比较最高价、最低价与上下轨的大小来确定交易信号。
import numpy as np
import pandas as pd
from sqlalchemy import create_engine
def trade_signal(code):
"""
计算交易信号,当股价低于布林下轨时买入,高于上轨时卖出
:param code: 股票代码
:return: 包含交易信号的DataFrame
"""
data = calculate_boll(code)
# 新建一个DataFrame,以data的index为index
df = pd.DataFrame(index=data.index)