为何要用问财呢?原因很简单----就是简单快速学习门槛更低,同时可以快速的验证自己的方案。举个简单的例子:web中有一个macd的例子:
"""
MACD技术指标交易策略:
macd金叉全仓买入并持有,macd死叉卖出并空仓。
策略使用步骤:
第一步:左侧策略代码编辑面板,代码第16-21行分别输入股票代码、指标参数、基准指数.
第二步:右上角选择回测日期、账户初始资金、回测频率.ps:本策略适合每日频率运行.
第三步:点击左上角“编译运行”白色按钮,进行快速回测,右边查看策略收益走势及运行日志.
第四步:点击右上角“进行回测”蓝色按钮,执行回测并进入回测详情页面,查看策略交易明
细、历史持仓、策略风险指标等情况.
第五步:在回测详情页面,点击右上角“开启仿真交易”蓝色按钮,策略即可在实时行情中运行,
打开交易信号提醒,在同花顺APP应用上实时收到策略交易信号.
"""
import talib
def init(context):
g.security = "600519.SH" #输入股票代码
#设置MACD模型参数
g.Short = 12 #短周期平滑均线参数
g.Long = 26 #长周期平滑均线参数
g.M = 9 #DIFF的平滑均线参数
set_benchmark("000300.SH") #设置基准指数,默认为沪深300
def handle_bar(context,bar_dict):
macd = get_macd(g.security)
if macd[-1]>0 and macd[-2]<0 and len(list(context.portfolio.stock_account.positions.keys())) == 0:
order_value(g.security,context.portfolio.available_cash)
log.info("买入 %s" % (g.security))
if macd[-2]>0 and macd[-1]<0 and len(list(context.portfolio.stock_account.positions.keys())) > 0:
order_target(g.security,0)
log.info("卖出 %s" % (g.security))
def get_macd(stock):
price = history(stock, ["close"], 500, "1d", True, "pre", is_panel=1)["close"]
DIFF, DEA, MACD = talib.MACD(price.values,
fastperiod = g.Short, slowperiod = g.Long, signalperiod = g.M)
return MACD
这个要是通过纯代码的操作,是相对复杂的,你必须了解股票基本面数据的获取方式方法而且还要有数据对比和计算通过爱问财,就是这么一句话搞定,当然出了这些,爱问财还有其他的,截大家可以看看可以通过资金面,技术面,基本面,消息面,四个不同的层面进行股票的筛选,是不是比单纯的一个指标或公式进行选股和交易更靠谱呢?
get_iwencai或query_iwencai函数是智能选股函数,可以通过输入自然语言,执行选股并获取股票列表.我们在研究环境里面要用这个哦也就是说supermind已经帮我们搞定了,速度方面是很快的,基本无延迟比通过数据算法来的快的多的多。后面会推出爱问财搜索的方法和技巧–其实爱问财首页也说的比较明白了
一句话实现了选股,当然还可以进行进一步的添加条件,也就是用自然语言解决了需要写代码,通过数列进行计算的问题,对于非编程人员来说是非常友好的。再举例:我想买入30分钟级别macd金叉且macd值在0-5之间的,而且没有负面新闻的,公司盈利连续增长的
这个例子只涉及到了一只股票,而且没有选股思路的接入而用爱问财:就是5分钟macd金叉,mtm金叉,rsi金叉的股票市值从小到大,非st,主板创业板
官方爱问财supermindweb版代码:
def init(context):
# 问句/想要选出的股票 这里面其实就是可以修改的参数
buy_stocks = "小市值,低估价值股"
balck_stocks = "st或停牌或上市20天内" # 黑名单股票
sell_stocks = "无" # 卖出股票股票
days = 10 # 持仓天数
Max_count = 1 # 最大持股数
is_hold_one = False
context.T_up = 0.15
context.T_down = - 0.3 # 止盈止损 是否开启
get_iwencai(buy_stocks,"want_stocks") # 问句/想要选出的股票
get_iwencai(balck_stocks,"black_stocks") # 黑名单股票
get_iwencai(sell_stocks,"sell_stocks") # 卖出股票特征
context.days = days # 持仓天数
context.Max_count = Max_count # 最大持股数
context.is_hold_one = is_hold_one # 止盈止损 是否开启
context.T_up = 0.15
context.T_down = - 0.3
context.hold_days = {} # 计时器
context.Cost = {} # 买入成本
def handle_bar(context,bar_dict):
# 止盈止损
if context.is_hold_one == True:
hold_on(context,bar_dict)
# 日常买卖
operation(context,bar_dict)
def hold_on(context,bar_dict):
sell_stocks = []
for stock in context.positions.keys():
price = history(stock, ["close"], 1, "1d")["close"][-1]
roc = price/context.Cost[stock]-1
if roc>context.T_up or roc<context.T_down:
sell_stocks.append(stock)
for stock in sell_stocks:
order_target_value(stock,0)
# 交易操作
def operation(context,bar_dict):
sell_stocks = []
for stock in list(context.portfolio.stock_account.positions.keys()):
# 如果在卖出股票池中则卖出
if stock in context.sell_stocks:
log.info("%s在卖出股票池"%stock)
sell_stocks.append(stock)
continue
if stock not in context.hold_days:
context.hold_days[stock] = 0
else:
context.hold_days[stock] += 1
if context.hold_days[stock] >= context.days:
log.info("%s持仓到期卖出"%stock)
sell_stocks.append(stock)
for stock in sell_stocks:
order_target_value(stock,0)
buy_stocks = [stock for stock in context.want_stocks if stock
not in context.black_stocks]
Count = max([0,context.Max_count-len(list(context.portfolio.stock_account.positions.keys()))])
if Count>0:
buy_stocks = buy_stocks[:Count]
for stock in buy_stocks:
order_percent(stock,1/context.Max_count)
context.hold_days[stock] = 0
h = history(stock, ["close"], 1, "1d")["close"][-1]
context.Cost[stock] = h
文章为作者独立观点,不代表股票交易接口观点