• Stars
    star
    148
  • Rank 248,798 (Top 5 %)
  • Language
    Python
  • Created almost 3 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

一款支持东方财富A股 自动交易的量化交易框架,支持简单回测

pytrader

基于 easytradereasyquotation 的量化交易框架

支持东方财富自动交易

安装

pip3 install -r requirements.txt
  • 手动安装talib依赖, talib

web 系统

新增web,可以设置关注的股票,显示T操作价格

关注的股票

策略文件

在strategies目录,可以参考已有的编写。

策略需要继承StrategyTemplate类,实现int和onbar等函数。

init 设置关注的股票,行情引擎就会推动股票行情。

    def init(self):
        for stock_code in self.watch_stocks:
            self.quotation_engine.watch(stock_code)

行情数据到来时,触发on_bar函数:

def on_bar(self, context: Context, data: Dict[str, DataFrame]):
    pass
  • Context 是一个工具类,可以获取其他bar或者计算cci、rsi等指标
  • data是推动的行情字典,可以用股票代码获取DataFrame类型的行情数据

在线交易

参见 tradertest.py ,会加载所有策略,稍微改动下也能支持制定策略

import easyquant
from easyquant import DefaultLogHandler

print('测试 DEMO')

# 东财
broker = 'eastmoney'

# 自己准备
# {
#     "user": "",
#     "password": ""# }
need_data = 'account.json'

log_type = 'file'

log_handler = DefaultLogHandler(name='测试', log_type=log_type, filepath='logs.log')

m = easyquant.MainEngine(broker,
                         need_data,
                         quotation='online',
                         # 1分钟K线
                         bar_type="1m",
                         log_handler=log_handler)
m.is_watch_strategy = True  # 策略文件出现改动时,自动重载,不建议在生产环境下使用
m.load_strategy()
m.start()

回测

参考backtest.py,设置回测的时间和策略,注意使用quotation需要为tushare或者jqdata,可以自己申请

import easyquotation

import easyquant
from easyquant import  DefaultLogHandler, PushBaseEngine
from easyquant.log_handler.default_handler import MockLogHandler
from strategies.CCI import Strategy

print('backtest 回测 测试 ')

broker = 'mock'
need_data = 'account.json'

#
mock_start_dt = "2020-01-01"
mock_end_dt= "2021-11-11"


m = easyquant.MainEngine(broker, need_data,
                         quotation='tushare',
                         # quotation='jqdata',
                         bar_type="1d")

log_handler = MockLogHandler(context=m.context)

# 选择策略
strategy = Strategy(user=m.user, log_handler=log_handler, main_engine=m)

m.start_mock(mock_start_dt, mock_end_dt, strategy)

print('mock end')

print(m.user.get_balance())

for deal in m.user.get_current_deal():
    print(deal.deal_time, deal.bs_type, deal.deal_price, deal.deal_amount)