# 本Python代码主要用于策略交易
# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
#本范例实现用户自行通过数据分析并以自行绘图展现分析结果
#基本思路:在每个月第一个交易日计算月涨幅收益,以及一些常用的财务因子和成交量技术因子,然后绘制热力图来找到有强关联性的因子
#扩展思路:我们可以把多只股票价格作为因子,然后去找有套利关联度的合约做组合。
#使用前注意补充好全市场日线历史数据、基础财务数据及专业财务数据
#推荐使用000001上证指数做基准合约,测试使用日线周期
from PythonApi import *
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。--(必须实现)
def init(context):
# 在context中保存全局变量
context.last_day = 0
# 初始化保存数据的pandas
context.data = []
# before_trading此函数会在每天基准合约的策略交易开始前被调用,当天只会被调用一次。--(选择实现)
def before_trading(context):
pass
# 你选择的品种的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新。--(必须实现)
def handle_bar(context):
# 开始编写你的主要的算法逻辑。
month = str(context.now.month)
month = month if context.now.month>9 else '0'+month
year = str(context.now.year)
#保存的csv文件名
csv_name = year+month
sh_code = get_blocks ('上海A股',0)
sz_code = get_blocks ('深圳A股',0)
sz_cy_code = get_blocks ('深圳创业',0)
day = context.now.day
if day<context.last_day:
#代码列表
code_list = sh_code+sz_code+sz_cy_code
#剔除数据量小于一个月的品种
stock = []
for i in code_list:
close=history_bars(i,22,'1d','CLOSE',True,False,True)
get_fin=get_finance(i,60,1,0,0)
if len(close)==22 and len(get_fin)>0:
stock.append(i)
stock_zf = []
#5日成交量均值
stock_vol_ma = []
#5日换手率
stock_vol_change = []
#收益率的22日方差
close_std = []
#这里获取的股票一个月的涨幅,适用于回归,如果有能力也可以判断是涨还是跌适用在分类(或者自行加入涨幅超过多少等等)
if len(stock)>0:
for i in stock:
close = history_bars(i,22,'1d','CLOSE',True,False,True)
volume = history_bars(i,5,'1d','volume',True,False,True)
get_fin=get_finance(i,60,1,0,0)
change = np.sum(volume) / get_fin[0].values
stock_vol_ma.append(np.mean(volume))
stock_vol_change.append(change)
close_std.append(np.std(np.diff(close)/close[0]))
stock_zf.append((close[-1]-close[0])/close[0])
#质量类因子
#净利率/总收入,销售毛利率,应收账款周转率,净利润增长,存贷款周转率,现金流量净额/净收益
#营业收入增长,现金流量净额增长率,净利润增长
#每股收益,每股营业收入,每股现金净额
indictor = ['npMARgin','grossMARgin','ARTurnover','niYOY','invenTurnover','nCFOpaOpap','revenueYOY','nCfOpaYOY','niYOY', 'EPS','tRevPS','nCfOperAPS']
li1 = fin_indicator(stock,indictor,1,0,0)
#基础因子
#营业收入,净利润,销售商品收到的现金
profit = ['revenue','NIncome']
cash = ['CFrSaleGS']
li2 = fin_profit_std(stock,profit,1,0,0)
li3 = fin_cashflow_std(stock,cash,1,0,0)
li_total = np.hstack((np.array(li1),np.array(li2)))
li_total = np.hstack((li_total,np.array(li3)))
df = pd.DataFrame(li_total,index=stock,columns=indictor+profit+cash)
df['vol_ma'] = stock_vol_ma
df['vol_change'] = stock_vol_change
df['close_std'] = close_std
df['return'] = stock_zf
if len(context.data)==0:
context.data = df
else:
context.data =pd.concat([context.data,df])
#存到数据文件中
df.to_csv(r"C:/"+csv_name+".csv")
# after_trading函数会在每天交易结束后被调用,当天只会被调用一次。 --(选择实现)
def after_trading(context):
context.last_day = context.now.day
# order_status当委托下单,成交,撤单等与下单有关的动作时,该方法就会被调用。---(选择实现)
#def order_status(context,order):
# pass
# order_action当查询交易接口信息时返回的通知---(选择实现)
#def order_action(context,type, account, datas)
# pass
# exit函数会在测评结束或者停止策略运行时会被调用。---(选择实现)
def exit(context):
test_report_none()
#读取数据文件
#data = pd.read_csv(r'C:\a\201808.csv')
data = context.data
data.drop(data.columns[0], axis=1,inplace=True)
plt.figure(figsize=(5,5))
plt.imshow(data.corr(), cmap=plt.cm.hot, vmin=0, vmax=1)
plt.xticks(np.arange(19),data.columns,rotation=60)
plt.yticks(np.arange(19),data.columns)
plt.colorbar()
plt.show()