In [6]:
# 首先将数据存入Mongodb, 请确保已打开mongod服务. 只需运行一次
from OnePy.builtin_module.mongodb_saver.tushare_saver import multi_tushare_to_mongodb
from OnePy.builtin_module.mongodb_saver.utils import MongoDBFunc
FREQUENCY = ["D","H1"]
START = '2010-01-01'
TICKER_LIST = ['000001','000002'] # 多线程导入数据
multi_tushare_to_mongodb(ticker_list=TICKER_LIST,
period_list=FREQUENCY,
fromdate=START)
MongoDBFunc().drop_duplicates(TICKER_LIST, FREQUENCY, 'tushare')
In [1]:
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
In [2]:
import OnePy as op
from OnePy.custom_module.cleaner_sma import SMA
class SmaStrategy(op.StrategyBase):
def __init__(self):
super().__init__()
self.sma1 = SMA(3, 40).calculate
self.sma2 = SMA(5, 40).calculate
def handle_bar(self):
for ticker in self.env.tickers:
if self.sma1(ticker) > self.sma2(ticker):
self.buy(100, ticker, takeprofit=15,
stoploss=100)
else:
self.sell(100, ticker)
TICKER_LIST = ['000001', '000002'] # 多品种
INITIAL_CASH = 20000
FREQUENCY = 'D'
START, END = '2012-08-07', '2018-08-07'
# 实例化策略,会自动添加到env.strategies中
SmaStrategy()
## 如果用CSV回测,注意csv文件名为name_frequency,同时要将下面MongoDB回测注释掉
# op.data_readers.CSVReader('../data/', file_name='000001', ticker='000001')
# go = op.backtest.stock([], FREQUENCY, INITIAL_CASH, START, END) # 设置好股票回测的基本配置
# 用MongoDB数据库回测
go = op.backtest.stock(TICKER_LIST, FREQUENCY, INITIAL_CASH, START, END)
# go.show_log(file=False) # 是否实时打印log
# go.save_original_signal() # 是否保存原始signal信息,便于盘后自定义分析
In [3]:
go.sunny(show_process=True)
In [4]:
go.output.plot('000001')
In [5]:
# 检查自己需要的模块是否正确导入
go.output.show_setting()
In [6]:
# go.output.analysis.detail_summary()
# go.output.analysis.general_summary()
go.output.summary2()
In [7]:
go.output.trade_log().head()
Out[7]:
In [8]:
# 回测后各原始结果都在recorder中, 本质都是字典,继承自UserDict
# go.env.recorder.holding_pnl
# go.env.recorder.realized_pnl
# go.env.recorder.commission
# go.env.recorder.market_value
# go.env.recorder.margin
# go.env.recorder.position
# go.env.recorder.avg_price
# go.env.recorder.cash
# go.env.recorder.frozen_cash
# go.env.recorder.balance
# 提供一下两种方法
# go.env.recorder.balance.dataframe()
go.env.recorder.balance.plot()
In [9]:
# 若打开保存原始signal开关, 回测厚可得到原始列表
go.save_original_signal()
go.sunny(summary=False,show_process=False)
In [10]:
# 一系列原始signals列表
# go.env.signals_pending[0]
# go.env.signals_trigger[0]
# go.env.signals_cancel[0]
go.env.signals_normal[0]
Out[10]:
In [12]:
# Hope you can find your OnePiece :)