コインを投げる戦略 (●''●)

作者: リン・ハーン, 2020年4月21日17時39分52秒
タグ:

完全T神公名,神特約戦略訳. メディアの報道によると, "千万の量化世界"をもっと注視して,もっと戦略のソースコードを得てください! 広告も作りました. 広報『豆の量化日記』 オンラインの破産を数値化して,毎日公開で罰せよう! 福利厚生がもっと増えるなら,あなたはもっと得られる.


波動率を正しく使って,BTC大金を稼ぐのは,これほど簡単です! 千万の量化世界 3日前 量化戦略の研究開発は2つの側面があります. 始めている人にとっては非常に難しいです. 難しさは,レベルのコードだけでなく,レベルの戦略的論理思考でもあります. どちらも重要です.

千万の量化者の皆さん,こんにちは!

この記事の特集は,第2回目です. 千千は,大神 (LE_CHIFFRE1) に招待されて光栄です. 微信LE_CHIFFRE1は,どのように波動率因子を使用して,簡単にBTC大盘を勝ち取ることができるか,

神 (やうしん) は伝統的な量投資機関出身で,かつてコイン圈取引所の業務にも深く関わっていた. 量化分野での豊富な経験とユニークな見解を持っています. この号の内容は,思想の啓示,コーディングの実現,個人的な悟りなどを含みます. 乾燥した物でいっぱいではないと言えません.

波動率の戦略についてお話しします.

01

前言

こんにちは,今日,千千の量化公众号で記事を推し進める機会があり,Tのボス (千千の外番号の1つ) の招待に感謝しています. 初めてTのボスに記事を書いて,完全に自由にプレイし,仕事後に余分な時間を借りて,品質と誤りも書いてください.

量化指数と戦略 (助成も自動化も可能) は,もちろん,最後に老舗がよく言うことを付け加える必要があります: 投資はリスクがあり,市場への入場は慎重で,戦略はすべての人にアイデアと教訓を提供することであり,利益と損失を自負することだけです. この戦略を使用するすべての利益と損失は,私自身と何千もの量化世界の公的な主体とは何の関係もありません.

免責声明が終わると,次の質問が始まります.

02

簡単な波動率戦略

私のことをよく知っている人は,私個人的に,アルファをあまり好きではないことを知っています. 私は比喩的にベータを信頼し,ベータを研究する方が多いです. なぜ,e.........mmmmm,わからない.

量化戦略の研究開発は,実は二面的なもので,初心者にとっては非常に難しいです. 難しさは,術の層のコードだけでなく,略の層の戦略的論理的思考でもあります. どちらも重要です,偏見はありません. 今日皆さんに紹介する戦略は,実は,何年も前に華泰の研究論文からインスピレーションを受けたものです.

この戦略アルゴリズムは,対数値の定周期値の値下落のローリング利回り原理を用いて,定周期ローリング最大値と最小値を探し,最大値が上方パイプ,最小値が下方パイプとして計算され,上方パイプを突破し,取引を開く.上下方パイプのローリング平均値が平行ラインとして計算される. (ここでは黒板を叩く!)

特定のグラフィックビジュアライゼーションインターフェースは,以下のPPTを参照してください. このグラフは,Pyechartsで自分で描いたもので,特定のコードも,T大で私的に相談してください.

img

実際,この戦略は,私が以前使っていた戦略である. 広範囲のETF,もちろん,指数選択時に株式の売買のために使用され,その後,直接コインリングに移され,驚いて,実際にダメージを減らすことを発見しました.

img

グラフは,その年のテスト結果を示し,特定の部分のコードロジックスクリーンショットです.

img

上の図は,データを読み取ってから,パンダで指標データを計算する図です.

img

計算が完了すると,pd.to_csv () 函数でデータ出力し,上記のスクリーンショットで使用されたpyecharts (注:古いバージョンのpyechartsを使用しています) を視覚化出力できます.

具体的には,すべての戦略,視覚化,およびパフォーマンス指標コードは,T大である.

03

量化について

まず第一に,良い戦略は公開を恐れず,これは戦争レベルの対決兵器開発ではなく,生死を決めるものなので,自分や他の機関や個人として,いわゆる秘密の戦略を恐れず,CTAには秘密がないので,私の考えでは,誰もが考えていたことや予想外の点だけしかありません.

2つ目は,新規でも経験のあるプレイヤーでも,多くの人がインスピレーションの源を必要としていること. 株の因子掘り,タイミング戦略のアイデアなど,主観的な経験,研究報告,輪内のコミュニケーション交流などから,現在市場にあるいくつかの戦略を購入し,それを読み,理解し,自分のリスク承受能力と特定のニーズに応じて改訂するなど.

結論として,量化とは,量化の中の一種であり,程序化取引は量化の中の一種である.大学時代 (約2009年) に,TBやピラミッドなどのプログラム化が既に有人狩猟されていた.もし今日も続けば,この部分の先見者は10年ほど前に,ウォール街のからを背負った高周波戦略やシステムを含まないと言えます.したがって,量化戦略や程序化戦略は,中国ではしばらくの間,存在しているものの,現在の市場シェアや主体,政策支持者の間で,量化はまだ非常に小さな存在の一部であり,多種多様な分析や戦略モデルが構築された研究が,天に飛ぶことを示唆しています.

最後に,自分の専門知識に対する信頼と記事への招待状をいただき,千千の量化市民に感謝します. 具体的なコードや戦略に関する質問があれば,私やT大にメールしてください.

ありがとうございました! ありがとうございました!

Qtのグループに参加していない友人は,すぐにグループに加わり,学習資料を入手してください!

千千本尊町ビル!

img

微信が掃く 市民の関心


/*backtest
start: 2020-01-20 00:00:00
end: 2021-01-19 23:59:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_BitMEX","currency":"XBT_USD","fee":[0.008,0.1]}]
args: [["st",0.1]]
*/

// 初始化
exchange.SetContractType('XBTUSD')
_CDelay(100)
// 止盈止损
var TP_status = false // 是否触发追踪止盈 
var TP_HH = 0
var TP_LL = 0
var B = 1

// 获取交易所信息
function UpdateInfo() {
    account = exchange.GetAccount()
    pos = exchange.GetPosition()
    records = exchange.GetRecords()
    ticker = exchange.GetTicker()
}

// 定制本次盈亏
function Onept() {
    // 更新用户信息
    UpdateInfo()
    // 如果现在余额 大于 之前的余额, 那么 盈利次数+1, 且pt_1设为现在余额
    if (account.Stocks - pt_1 > 0) {
        pt_times = pt_times + 1
        Log('这回赚钱啦~~~~ (^U^)ノ~YO', account.Stocks - pt_1)
        B = 1
        pt_1 = account.Stocks
    }
    // 如果现在余额 小于 之前的余额, 那么 亏损次数+1, 且pt_1设为现在余额
    if (account.Stocks - pt_1 < 0) {
        st_times = st_times + 1
        Log('这回亏掉了.... /(ㄒoㄒ)/~~', account.Stocks - pt_1)
        B = B * 1.618
        pt_1 = account.Stocks
    }
}

// 画线
function PlotMA_Kline(records) {
    $.PlotRecords(records, "K")
}

// 追踪止盈 初始%, 追踪U
function TP() {
    var TP_first_long = pos[0].Price + tp_first * ticker.Last
    var TP_trailing_long = TP_HH - trailing_tp * ticker.Last
    var TP_first_short = pos[0].Price - tp_first * ticker.Last
    var TP_trailing_short = TP_LL + trailing_tp * ticker.Last
    // 当多仓时, 现价大于开仓+初始止赢价 -> 触发追踪止盈 
    if ((pos[0].Type == 0) && (ticker.Last > TP_first_long)) {
        // Log('当多仓时, 现价大于开仓+初始止赢价 -> 触发追踪止盈', TP_HH)
        TP_status = true
        // 触发追踪止盈, 未初始化开仓最大价格 -> 开仓后最大价格更新为现价
        if (TP_status === true && TP_HH == 0) {
            Log('触发追踪止盈, 未初始化开仓最大价格 -> 开仓后最大价格更新为现价', TP_HH)
            TP_HH = ticker.Last
        }
        // 触发追踪止盈, 已有开仓后最大价格, 现价大于开仓后最大价格 -> 开仓后最大价格更新为现价
        else if (TP_status === true && TP_HH != 0 && ticker.Last > TP_HH) {
            Log('触发追踪止盈, 已有开仓后最大价格, 现价大于开仓后最大价格 -> 开仓后最大价格更新为现价', TP_HH)
            TP_HH = ticker.Last
        }
        // 触发追踪止盈, 已有开仓后最大价格, 现价小于 (开仓后最大价格减 - 回撤USD) -> 开空平仓止盈
        else if (TP_status === true && TP_HH != 0 && ticker.Last < TP_trailing_long) {
            Log('触发追踪止盈, 已有开仓后最大价格, 现价小于 (开仓后最大价格减 - 回撤USD) -> 开空平仓止盈', TP_HH)
            exchange.SetDirection("closebuy")
            exchange.Sell(ticker.Buy, pos[0].Amount, "在" + ticker.Last + "止赢平多仓!! 开仓价格: " + pos[0].Price + "数量: " + pos[0].Amount)
            $.PlotFlag(new Date().getTime(), 'Sell', 'PT_BK' + ticker.Sell)
            Onept()
            TP_status = false
            TP_HH = 0
        }
    }
    // 当空仓时, 现价小于开仓-初始止赢价 -> 触发追踪止盈
    else if ((pos[0].Type == 1) && (ticker.Last < TP_first_short)) {
        // Log('当空仓时, 现价小于开仓-初始止赢价 -> 触发追踪止盈', TP_LL)
        TP_status = true
        // 触发追踪止盈, 未初始化开仓最大价格 -> 开仓后最小价格更新为现价
        if (TP_status === true && TP_LL == 0) {
            Log('触发追踪止盈, 未初始化开仓最大价格 -> 开仓后最小价格更新为现价', TP_LL)
            TP_LL = ticker.Last
        }
        // 触发追踪止盈, 已有开仓后最小价格, 现价小于开仓后最小价格 -> 开仓后最小价格更新为现价
        else if (TP_status === true && TP_LL != 0 && ticker.Last < TP_LL) {
            Log('触发追踪止盈, 已有开仓后最小价格, 现价小于开仓后最小价格 -> 开仓后最小价格更新为现价', TP_LL)
            TP_LL = ticker.Last
        }
        // 触发追踪止盈, 已有开仓后最小价格, 现价大于 (开仓后最小价格减 + 回撤USD) -> 开多平仓止盈
        else if (TP_status === true && TP_LL != 0 && ticker.Last > TP_trailing_short) {
            Log('触发追踪止盈, 已有开仓后最小价格, 现价大于 (开仓后最小价格减 + 回撤USD) -> 开多平仓止盈', TP_LL)
            exchange.SetDirection("closesell")
            exchange.Buy(ticker.Sell, pos[0].Amount, "在" + ticker.Last + "止赢平空仓!! 开仓价格: " + pos[0].Price + "数量: " + pos[0].Amount)
            $.PlotFlag(new Date().getTime(), 'Buy', 'PT_SK' + ticker.Sell)
            Onept()
            TP_status = false
            TP_LL = 0
        }
    }
}

// 止损 %
function Stoploss() {
    // 当多仓时, 现价小于开仓-止损价, 做空平多
    if ((pos[0].Type == 0) && (ticker.Last < pos[0].Price - st * ticker.Last)) {
        Log('当多仓时, 现价小于开仓-止损价, 做空平多')
        exchange.SetDirection("closebuy")
        exchange.Sell(ticker.Buy, pos[0].Amount, "在" + ticker.Last + "止损平多仓!! 开仓价格: " + pos[0].Price + "数量: " + pos[0].Amount)
        $.PlotFlag(new Date().getTime(), 'Sell', 'ST_BK' + ticker.Buy)
        Onept()
    }
    // 当空仓时, 现价大于开仓+止损价, 做多平空
    else if ((pos[0].Type == 1) && (ticker.Last > pos[0].Price + st * ticker.Last)) {
        Log('当空仓时, 现价大于开仓+止损价, 做多平空')
        exchange.SetDirection("closesell")
        exchange.Buy(ticker.Sell, pos[0].Amount, "在" + ticker.Last + "止损平空仓!! 开仓价格: " + pos[0].Price + "数量: " + pos[0].Amount)
        $.PlotFlag(new Date().getTime(), 'Buy', 'ST_SK' + ticker.Sell)
        Onept()
    }
}

// 计算凯利公式 仓位
function PriceAmount() {
    // 赢可以赢多少 
    y = tp_first
    // 输会输多少 
    s = st
    //赔率
    b = y / s
    // 赢的概率
    if (total_times < 10) {
        p = 0.382
    } else {
        p = pt_times / total_times
    }
    // 输的概率
    q = 1 - p
    // 凯莉公式
    f = (b * p - q) / b
    // 限制B最大值
    if (B > 16.18) {
        B = 16.18
    }
    //Amount = _N(Math.abs(f) * account.Stocks * ticker.Last * B, 0)
    Amount = _N(0.618 * account.Stocks * ticker.Last, 0)
    //Log(Amount)
}

// 交易逻辑
function onTick() {
    // 获取均匀分布 0-9 随机数
    ToTheMoon = Math.floor(Math.random() * 10)
    // 无仓位时
    if (pos.length == 0) {
        // Long 
        if (ToTheMoon > 5) {
            exchange.SetDirection("buy")
            exchange.Buy(ticker.Sell, Amount)
            $.PlotFlag(new Date().getTime(), 'Buy', 'BK' + ticker.Sell)
            total_times = total_times + 1
        }
        // Short 
        if (ToTheMoon < 4) {
            exchange.SetDirection("sell")
            exchange.Sell(ticker.Buy, Amount)
            $.PlotFlag(new Date().getTime(), 'Sell', 'SK' + ticker.Buy)
            total_times = total_times + 1
        }
    }
        // 多仓时
    if (pos.length > 0 && pos[0].Type == 0) {
        // 平多 
        if (ToTheMoon < 1) {
            exchange.SetDirection("closebuy")
            exchange.Sell(ticker.Buy, pos[0].Amount)
            $.PlotFlag(new Date().getTime(), 'Sell', 'PBK')
            Onept()
        }
    }
    // 空仓时
    if (pos.length > 0 && pos[0].Type == 1) {
        // 平空 
        if (ToTheMoon > 8) {
            exchange.SetDirection("closesell")
            exchange.Buy(ticker.Sell, pos[0].Amount)
            $.PlotFlag(new Date().getTime(), 'Buy', 'PSK')
            Onept()
        }
    }
}


function main() {
    UpdateInfo()
    // 统计
    pt_1 = account.Stocks
    total_times = 0
    pt_times = 0
    st_times = 0
    while (1) {
        UpdateInfo()
        PriceAmount()
        onTick()
        PlotMA_Kline(records)
        if (pos.length > 0) {
            TP()
        }
        if (pos.length > 0) {
            Stoploss()
        }
        LogStatus("总余额: " + _N(ticker.Last * account.Stocks, 2), " 下单量: " + Amount, " 下单倍数: " + B, " ToTheMoon: " + ToTheMoon, " 下单量比: " + _N(Amount * 100 / _N(ticker.Last * account.Stocks, 2), 2), "% 胜率: " + _N(p * 100, 2), "%", total_times, pos)
    }
}

もっと

アール通貨安安版に変えられるか?