量化學(xué)習(xí)中的一點(diǎn)編程體會

在我的 19 年的年度學(xué)習(xí)計劃中续搀,量化交易是其中的一項(xiàng)大的工程焰薄,是自己下定決心要攻克的一個難題。應(yīng)該說 19 年是我的量化學(xué)習(xí)年止喷,為了強(qiáng)化自己的決定,我付費(fèi)在年初參加了邢不行的量化學(xué)習(xí)課程混聊,到現(xiàn)在已經(jīng)過了一個多月弹谁,自己從沒有摸過 python , 到能用 python 編寫簡單的量化程序。除了認(rèn)真學(xué)習(xí)課程外,也下了很大的功夫和精力预愤。

我的第一個布林策略也已經(jīng)運(yùn)行了一段時間了沟于,程序的改進(jìn)也一直在進(jìn)行。從測試的情況看植康,效果應(yīng)該還不錯旷太。

在改進(jìn)程序的過程中,我對最初的量化程序進(jìn)行了重構(gòu)销睁,盡量將量化策略和相關(guān)的交易所代碼分離供璧。這樣一個量化策略寫完,只要適配一下交易所的代碼冻记,就可以在另外的交易所上運(yùn)行了睡毒。

在編程的過程中,對于一些常見問題的解決方法冗栗,有了一些體會演顾。我把它寫下來。

  • 程序運(yùn)行的參數(shù)全部使用配置文件隅居,這樣運(yùn)行程序時钠至,使用不同的配置文件就可以了。
oscardeMacBook-Pro:oscbot oscar$ ./okex_boll.py 
Usage: okex_boll.py -c 策略配置文件 
okex 布林線策略
okex_boll.py: error: 請指定策略配置文件军浆!

我的主程序代碼:

#!/usr/bin/env python
# -*-coding:utf-8-*-

from bots.adaptation.trend_okex import TrendOkex
from bots.exchanges.okex_level import OkexLevel
from bots.algo.boll import BollAlgo
from bots.util.log import config_log
from bots.util.util import check_network, get_config
import logging

from optparse import OptionParser

parser = OptionParser(usage="%prog -c 策略配置文件 \nokex 布林線策略\n")

parser.add_option("-c", "--configfile",
                  action="store",
                  type='string',
                  dest="configfile",
                  help="指定策略運(yùn)行配置文件"
                  )

(options, args) = parser.parse_args()

if not options.configfile:
    parser.error('請指定策略配置文件棕洋!')

options = get_config(options.configfile)

config_log(options['name'], options['log'])

if not check_network():
    print('網(wǎng)絡(luò)錯誤,無法連接 google.com 請先檢查網(wǎng)絡(luò)或設(shè)置代理')
    exit(1)

logging.info('use config:%s', options['algo'])

ok = OkexLevel(options['algo']['trade'], options['algo']['base'], auths=options['api'])

tokex = TrendOkex(ok)

boll_algo = BollAlgo(tokex, para=[options['algo']['n'], options['algo']['m']], name=options['name'],
                     interval=options['algo']['interval'])

boll_algo.run()

我把所有策略的配置文件放在程序的 configs 目錄下,運(yùn)行產(chǎn)生的 log ,放在 logs 目錄下乒融。

配置文件示例:

{
  "name": "okex_boll",
  "log": "./logs/okex_boll.log",
  "algo": {
    "trade": "eth",
    "base": "usdt",
    "interval": 30,
    "n": 200,
    "m": 2
  },
  "api": {
    "name": "okex",
    "key": "**************",
    "secret": "******************",
    "pass": "***********"
  }
}

上面的布林參數(shù)我已經(jīng)改過了掰盘,請不要照抄使用!

  • 程序運(yùn)行的 log 是非常重要的赞季,在程序有問題的時候愧捕,我們需要它來查找 bug.

以下是配置 log 的代碼

def config_log(name='oscbot',logfile=''):
    """
    設(shè)置 log 
    :param name:
    :return:
    """
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)  # Log等級總開關(guān)

    logger.name = name

    formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")

    # log to console
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    console.setFormatter(formatter)
    logger.addHandler(console)

    # log to file
    if logfile == '':
        logfile = './' + name + '.log'
    fh = logging.FileHandler(logfile, mode='a')
    fh.setLevel(logging.INFO)  # 輸出到file的log等級的開關(guān)
    fh.setFormatter(formatter)
    logger.addHandler(fh)

    # log to 釘釘
    config = json_config('config.json')
    dd = DingDing(robot_id=config['dingding']['robot_id'])
    formatter = logging.Formatter('%(name)s - %(message)s')
    dd.setFormatter(formatter)
    logger.addHandler(dd)
  • 在寫交易所的代碼過程中,下單取帳戶數(shù)據(jù)要考慮失敗重試申钩,我使用 tenacity 庫使得這部分的代碼不會太繁瑣次绘。
from tenacity import retry, wait_exponential, stop_after_attempt
    @retry(wait=wait_exponential(multiplier=1, max=10), reraise=True, stop=stop_after_attempt(6))
    def get_kicker(self):
        try:
            return self.spotAPI.get_specific_ticker(self.instrument_id)
        except Exception as e:
            logging.error('取末成交訂單失敗:%s', e, extra={'dingding': True})
            logging.error(e, exc_info=True)
            raise e

需要了解的話,可以搜索一下它的用法撒遣。

  • 為了加快速度邮偎,很多情況下從交易所取得的數(shù)據(jù),可以緩存下來义黎,供以后使用禾进。所以我在代碼中使用了 lru_cache
from functools import lru_cache

@lru_cache(maxsize=32)
@retry(wait=wait_exponential(multiplier=1, max=10), reraise=True, stop=stop_after_attempt(6))
def level_config_info(api,instrument_id):
    try:
        return api.get_specific_config_info(instrument_id)
    except Exception as e:
        logging.warning('取杠桿配置信息報錯:%s', e, extra={'dingding': True})
        logging.error(e, exc_info=True)
        raise e

# 杠桿配置信息
def level_info(self,refresh=False):
        if refresh:
            level_config_info.cache_clear()
        return level_config_info(self.levelAPI,self.instrument_id)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市廉涕,隨后出現(xiàn)的幾起案子泻云,更是在濱河造成了極大的恐慌艇拍,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宠纯,死亡現(xiàn)場離奇詭異卸夕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)婆瓜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門快集,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勃救,你說我怎么就攤上這事碍讨≈瘟Γ” “怎么了蒙秒?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宵统。 經(jīng)常有香客問我晕讲,道長,這世上最難降的妖魔是什么马澈? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任瓢省,我火速辦了婚禮,結(jié)果婚禮上痊班,老公的妹妹穿的比我還像新娘勤婚。我一直安慰自己,他們只是感情好涤伐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布馒胆。 她就那樣靜靜地躺著,像睡著了一般凝果。 火紅的嫁衣襯著肌膚如雪祝迂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天器净,我揣著相機(jī)與錄音型雳,去河邊找鬼。 笑死山害,一個胖子當(dāng)著我的面吹牛纠俭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浪慌,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼冤荆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了眷射?” 一聲冷哼從身側(cè)響起匙赞,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤佛掖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涌庭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芥被,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年坐榆,在試婚紗的時候發(fā)現(xiàn)自己被綠了拴魄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡席镀,死狀恐怖匹中,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豪诲,我是刑警寧澤顶捷,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站屎篱,受9級特大地震影響服赎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜交播,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一重虑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秦士,春花似錦缺厉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至次洼,卻和暖如春关贵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卖毁。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工揖曾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亥啦。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓炭剪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翔脱。 傳聞我的和親對象是個殘疾皇子奴拦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348