In [1]:
import QUANTAXIS as QA
try:
assert QA.__version__>='1.1.0'
except AssertionError:
print('pip install QUANTAXIS >= 1.1.0 请升级QUANTAXIS后再运行此示例')
In [2]:
print('首先确定你已经完成了对于QUANTAXIS的基础认知,以及在本地存储完毕了QUANTAXIS的数据库')
In [3]:
Account=QA.QA_Account()
Broker=QA.QA_BacktestBroker()
In [4]:
import warnings
In [ ]:
In [5]:
# # 打印账户的信息
# try:
# from pprint import pprint as print
# except:
# pass
# print(Account.message)
QA_Account在初始化的时候,可以自己指定很多信息:
QA_Account(
strategy_name=None, user_cookie=None, portfolio_cookie=None, account_cookie=None,
market_type=MARKET_TYPE.STOCK_CN, frequence=FREQUENCE.DAY, broker=BROKER_TYPE.BACKETEST,
init_hold={}, init_cash=1000000, commission_coeff=0.00025, tax_coeff=0.0015,
margin_level=False, allow_t0=False, allow_sellopen=False,
running_environment=RUNNING_ENVIRONMENT.BACKETEST)
:param [str] strategy_name: 策略名称
:param [str] user_cookie: 用户cookie
:param [str] portfolio_cookie: 组合cookie
:param [str] account_cookie: 账户cookie
:param [dict] init_hold 初始化时的股票资产
:param [float] init_cash: 初始化资金
:param [float] commission_coeff: 交易佣金 :默认 万2.5 float 类型
:param [float] tax_coeff: 印花税 :默认 千1.5 float 类型
:param [Bool] margin_level: 保证金比例 默认False
:param [Bool] allow_t0: 是否允许t+0交易 默认False
:param [Bool] allow_sellopen: 是否允许卖空开仓 默认False
:param [QA.PARAM] market_type: 市场类别 默认QA.MARKET_TYPE.STOCK_CN A股股票
:param [QA.PARAM] frequence: 账户级别 默认日线QA.FREQUENCE.DAY
:param [QA.PARAM] broker: BROEKR类 默认回测 QA.BROKER_TYPE.BACKTEST
:param [QA.PARAM] running_environment 当前运行环境 默认Backtest
# 2018/06/11 init_assets 从float变为dict,并且不作为输入,作为只读属性
# :param [float] init_assets: 初始资产 默认 1000000 元 (100万)
init_assets:{
cash: xxx,
stock: {'000001':2000},
init_date: '2018-02-05',
init_datetime: '2018-02-05 15:00:00'
}
# 2018/06/11 取消在初始化的时候的cash和history输入
# :param [list] cash: 可用现金 默认 是 初始资产 list 类型
# :param [list] history: 交易历史
In [6]:
# 重设账户初始资金
Account.reset_assets(200000)
Account.account_cookie='JCSC_EXAMPLE'
In [7]:
Account.init_assets
Out[7]:
Account 有很多方法,暂时不详细展开,我们先直接进入下一步
引入方法非常简单,直接使用QA_fetch_stock_day_adv系列即可
1. QA.QA_fetch_stock_list_adv().code.tolist() # 获取全市场的股票代码
2. QA.QA_fetch_stock_block_adv().get_block('云计算').code # 按版块选取
3. code= ['000001','000002'] # 自己指定
data=DataSturct.to_qfq()
In [8]:
# QA.QA_fetch_stock_list_adv().code.tolist()
# QA.QA_fetch_stock_block_adv().get_block('云计算').code
#codelist=QA.QA_fetch_stock_block_adv().get_block('云计算').code
codelist=['000001']
In [9]:
data=QA.QA_fetch_stock_day_adv(codelist,'2017-09-01','2018-05-20')
In [10]:
data
Out[10]:
In [11]:
data=data.to_qfq()
In [12]:
# data.data
In [13]:
import numpy as np
import pandas as pd
def MACD_JCSC(dataframe,SHORT=12,LONG=26,M=9):
"""
1.DIF向上突破DEA,买入信号参考。
2.DIF向下跌破DEA,卖出信号参考。
"""
CLOSE=dataframe.close
DIFF =QA.EMA(CLOSE,SHORT) - QA.EMA(CLOSE,LONG)
DEA = QA.EMA(DIFF,M)
MACD =2*(DIFF-DEA)
CROSS_JC=QA.CROSS(DIFF,DEA)
CROSS_SC=QA.CROSS(DEA,DIFF)
ZERO=0
return pd.DataFrame({'DIFF':DIFF,'DEA':DEA,'MACD':MACD,'CROSS_JC':CROSS_JC,'CROSS_SC':CROSS_SC,'ZERO':ZERO})
In [14]:
ind=data.add_func(MACD_JCSC)
In [15]:
ind.xs(codelist[0],level=1)['2018-01'].plot()
Out[15]:
In [16]:
ind.xs(codelist[0],level=1)['2018-01']
Out[16]:
In [ ]:
In [17]:
ind.loc['2018-01',slice(None)]
Out[17]:
In [18]:
data_forbacktest=data.select_time('2018-01-01','2018-05-01')
for items in data_forbacktest.panel_gen:
for item in items.security_gen:
daily_ind=ind.loc[item.index]
if daily_ind.CROSS_JC.iloc[0]>0:
order=Account.send_order(
code=item.code[0],
time=item.date[0],
amount=1000,
towards=QA.ORDER_DIRECTION.BUY,
price=0,
order_model=QA.ORDER_MODEL.CLOSE,
amount_model=QA.AMOUNT_MODEL.BY_AMOUNT
)
#print(item.to_json()[0])
Broker.receive_order(QA.QA_Event(order=order,market_data=item))
trade_mes=Broker.query_orders(Account.account_cookie,'filled')
res=trade_mes.loc[order.account_cookie,order.realorder_id]
order.trade(res.trade_id,res.trade_price,res.trade_amount,res.trade_time)
elif daily_ind.CROSS_SC.iloc[0]>0:
if Account.sell_available.get(item.code[0], 0)>0:
order=Account.send_order(
code=item.code[0],
time=item.date[0],
amount=Account.sell_available.get(item.code[0], 0),
towards=QA.ORDER_DIRECTION.SELL,
price=0,
order_model=QA.ORDER_MODEL.MARKET,
amount_model=QA.AMOUNT_MODEL.BY_AMOUNT
)
Broker.receive_order(QA.QA_Event(order=order,market_data=item))
trade_mes=Broker.query_orders(Account.account_cookie,'filled')
res=trade_mes.loc[order.account_cookie,order.realorder_id]
order.trade(res.trade_id,res.trade_price,res.trade_amount,res.trade_time)
Account.settle()
#break
In [19]:
Account.history
Out[19]:
In [20]:
Account.history_table
Out[20]:
In [21]:
#pd.concat([Account.daily_hold.reset_index().set_index('date'),pd.Series(data=None,index=pd.to_datetime(Account.trade_range).set_names('date'),name='predrop')],axis=1).ffill().drop(['predrop'],axis=1).reset_index()
In [22]:
Account.daily_cash.cash.plot()
Out[22]:
In [23]:
Account.daily_hold
Out[23]:
In [ ]:
In [24]:
Risk=QA.QA_Risk(Account)
In [25]:
Risk.message
Out[25]:
In [26]:
Risk.market_value.diff().iloc[-1]
Out[26]:
In [27]:
Risk.account.cash_table
Out[27]:
In [28]:
z=Account.cash_table.drop_duplicates(subset='date', keep='last').set_index(['date', 'account_cookie'], drop=False)
In [29]:
res=Account.cash_table.drop_duplicates(subset='date', keep='last')
zx=pd.concat([res.set_index('date'),pd.Series(data=None,index=pd.to_datetime(Account.trade_range),name='predrop')],axis=1).ffill().drop(['predrop'],axis=1)
In [30]:
zxx=pd.to_datetime(Account.trade_range)
In [31]:
zxx.set_names('date')
Out[31]:
In [32]:
Account.daily_hold.index.levels[0]
Out[32]:
In [33]:
#pd.Series(data=None,index=Account.trade_range,name='date')
In [ ]:
In [34]:
Risk.market_value.sum(axis=1)
Out[34]:
In [35]:
Account.history_table
Out[35]:
In [36]:
Account.cash_table
Out[36]:
In [37]:
Risk.assets
Out[37]:
In [38]:
Risk.assets.plot()
Out[38]:
In [39]:
Risk.benchmark_assets.plot()
Out[39]:
In [40]:
Risk.plot_assets_curve()
Out[40]:
In [41]:
Risk.plot_dailyhold()
Out[41]:
In [42]:
Risk.plot_signal()
Out[42]:
In [43]:
Risk.profit_construct
Out[43]:
In [44]:
Performance=QA.QA_Performance(Account)
In [45]:
Performance.pnl_fifo
Out[45]:
In [46]:
Performance.plot_pnlmoney(Performance.pnl_fifo)
Out[46]:
In [47]:
Account.save()
Risk.save()
In [48]:
account_info=QA.QA_fetch_account({'account_cookie':'JCSC_EXAMPLE'})
In [ ]:
In [49]:
account=QA.QA_Account().from_message(account_info[0])
In [50]:
account
Out[50]:
In [ ]: