去年花了很多时间在学习股票投资上,还折腾了量化交易。
市场如战场,每时每刻行情都会变。我尝试过盯盘,太累了,而且一直盯盘会让自己心情起落不定,心态不平稳,同时也会导致自己不能专注于工作。
量化的好处是不用自己盯盘了,写好策略后让电脑按照策略执行就可以了。其实炒股就是根据当前舆论、市场的情况预测自己看好的股票会涨还是会跌,预测会涨就买入,预测会跌就卖出。不过我现在的水平还很菜,一直没敢实盘。
我用的是掘金量化平台,可以去 https://www.myquant.cn/terminal 下载,安装好后把sdk什么的装好就能用了。
单均线策略很简单:首先计算出一条均线,当天价格上穿均线则买入,当天价格下穿均线则卖出。
下面是一个单均线策略,用talib库计算20日SMA均线指标。
导入python库
1 2 3 4 5
| from __future__ import print_function, absolute_import import gm.pb.account_pb2 from gm.api import * import talib
|
设置标的:
1 2 3 4 5 6 7
|
def choose_stock(context): context.symbol_list = ["SHSE.510300"] context.frequency='1d' context.bar_count=60 subscribe(symbols=context.symbol_list, frequency=context.frequency, count=context.bar_count)
|
计算指标:
1 2 3 4 5 6 7 8 9
| def indicators(context): data = context.data(symbol=context.symbol_list[0], frequency=context.frequency, count=context.bar_count, fields='close,bob') context.close= data['close'].values context.sma = talib.SMA(context.close, 20)
|
打印买卖交易情况
1 2 3 4 5 6
| def print_order(orders:gm.pb.account_pb2.Orders): order=orders[0] if order.side==OrderSide_Buy: print(order.updated_at,'买入:'+order.symbol+' 价格为:',order.price,'买入量为:',order.volume) else: print(order.updated_at,'卖出:'+order.symbol+' 价格为:',order.price,'卖出量为:',order.volume)
|
风控:
1 2 3
| def control_risk(context): pass
|
择时,判断买卖点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| def timing(context): control_risk(context) Account_position = context.account().position(symbol=context.symbol_list[0], side=PositionSide_Long) if not Account_position: if len(context.sma)>2 and context.close[-2]<context.sma[-2] and context.close[-1]>context.sma[-1]: context.order=order_value( symbol=context.symbol_list[0], value=context.account().cash.available, price=context.close[-1]*1.1, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Open) print_order(context.order) else: if len(context.sma)>2 and context.close[-2]>context.sma[-2] and context.close[-1]<context.sma[-1]: context.order=order_volume( symbol=context.symbol_list[0], volume=Account_position.volume, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Close, price=context.close[-1]*0.9) print_order(context.order)
|
初始化策略:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| def init(context): account=context.account() choose_stock(context) k线柱事件回调 def on_bar(context,bars): indicators(context) timing(context) 主程序运行策略: if __name__ == '__main__': ''' strategy_id策略ID, 由系统生成 filename文件名, 请与本文件名保持一致 mode运行模式, 实时模式:MODE_LIVE回测模式:MODE_BACKTEST token绑定计算机的ID, 可在系统设置-密钥管理中生成 backtest_start_time回测开始时间 backtest_end_time回测结束时间 backtest_adjust股票复权方式, 不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST backtest_initial_cash回测初始资金 backtest_commission_ratio回测佣金比例 backtest_slippage_ratio回测滑点比例 ''' run(strategy_id='xxxx', filename='main.py', mode=MODE_BACKTEST, token='xxxx', backtest_start_time='2012-1-01 08:00:00', backtest_end_time='2024-1-01 16:00:00', backtest_adjust=ADJUST_PREV, backtest_initial_cash=10000000, backtest_commission_ratio=0.0001, backtest_slippage_ratio=0.0001)
|
策略执行时会打印出买卖信息。

用这个策略回测了2012年到2024年这十二年的结果如下:
策略收益为49.26%跑输沪深300

改为5日均线后可以看到收益增加到71.65%,手续费也大大增加。

这一篇就到这里啦。欢迎大家点赞、转发、私信。
