La stratégie de lancer des pièces (●''●)

Auteur:Les haricots, Date: le 21 février 2020 17:39:52
Les étiquettes:

Le nom public de T'Challa est le même que celui de T'Challa, et le nom de T'Challa est le même que celui de T'Challa. Voici le contenu de l'émission. S'il vous plaît, faites attention à "Le monde quantifié par milliers" pour obtenir plus de code source de la stratégie! Il a aussi fait une publicité pour lui-même. Le journal public "Le journal quantitatif des haricots rouges" Il y a des milliers de personnes qui ont été condamnées à la faillite quotidiennement. Il y a plus d'avantages sociaux, plus vous pouvez en profiter.


C'est aussi simple que de gagner du BTC avec une bonne volatilité! Il y a 3 jours, le monde quantifié par milliers a été créé. La recherche et le développement de stratégies de quantification du lithium sont en fait à double sens, très difficiles pour ceux qui commencent tout juste, difficiles non seulement pour le code au niveau du lithium, mais aussi pour la logique stratégique au niveau du lithium.

Bonjour à tous les petits amis de la quantité!

Ce billet est la deuxième édition de l'exposé spécial, et nous sommes très honorés d'être invités à le voir (le micro-signal LE_CHIFFRE1) pour vous présenter: comment utiliser le facteur de volatilité pour gagner facilement sur le marché BTC et atteindre le but de la lutte contre le taux de dépréciation!

Il est issu d'une institution traditionnelle de placement de quantité, a également été profondément impliqué dans les affaires de l'échange de billets, a une riche expérience et des idées uniques dans le domaine de la quantification. Le contenu de ce numéro couvre l'inspiration de l'idée, la mise en œuvre du codage et la réalisation personnelle, etc.

Je vous invite à découvrir les stratégies des taux de volatilité.

01

Précédent

Bonjour, aujourd'hui, j'ai le privilège de publier un article dans le numéro de presse de masse de masse de masse, et je tiens également à remercier le patron T (l'un des milliers de numéros étrangers) pour son invitation.

Le patron de T dit d'écrire un chiffre quantifié, sans donner de portée, sans vraiment savoir d'où il vient. Alors commencez par votre sujet de discussion préféré avec les autres. Indicateurs quantifiés et stratégies (qui peuvent être aidés ou automatisés), bien sûr, enfin, nous ajoutons une phrase que les gens disent souvent: investir en tant que grand est risqué, entrer sur le marché doit être prudent, la stratégie est juste pour donner des idées et des leçons, gagner et perdre.

Après avoir terminé la déclaration d'exonération, voici le début de la vraie question.

02

Une stratégie simple de volatilité

Les gens qui me connaissent savent que personnellement, je n'aime pas beaucoup le jeu Alpha, et que je fais plutôt confiance à la version bêta, plutôt à la recherche de versions bêta.

Le développement de stratégies de quantification est en fait à double sens, très difficile pour ceux qui viennent d'entrer, difficile non seulement le code au niveau de la magie magique, mais aussi la logique stratégique au niveau de la magie. Les deux sont importants et ne doivent pas être biaisés. La stratégie que je vous présente aujourd'hui est en fait l'inspiration d'un article de recherche de HuaThai il y a de nombreuses années.

L'algorithme de la stratégie utilise le principe de la fluctuation du taux de rendement en rotation de la chute du prix de la logique sur des cycles déterminés, en fonction de cette période de fluctuation, la recherche de valeurs maximales et minimales de rotation de certains cycles est calculée, la valeur la plus élevée étant le pipeline vers le haut, la valeur la plus faible étant le pipeline vers le bas, la rupture du pipeline vers le haut, l'ouverture d'une position.

L'interface de visualisation graphique spécifique peut être consultée dans le PPT ci-dessous.

img

En fait, cette stratégie est la même que celle utilisée par lui-même pour faire des ETF à large base, bien sûr, elle est également utilisée pour acheter et vendre des actions lors de la sélection d'indices, puis déplacée directement dans la sphère monétaire.

img

Le graphique ci-dessous montre les performances de la revue pour l'année, avec une capture d'écran de logique de code spécifique:

img

En fait, après avoir lu les données, les pandas sont utilisés pour calculer les données d'indicateur.

img

Une fois le calcul terminé, vous pouvez exécuter la sortie de données avec la fonction pd.to_csv et visualiser les pyecharts utilisés dans la capture d'écran ci-dessus.

Toutes les stratégies, visualisations et codes pour les indicateurs de performance sont des "T-shirts".

03

Le débat est quantifié

La première: il y a beaucoup de questions ou de gens qui se demandent pourquoi vous pouvez publier des stratégies réelles, des faux imposteurs? ou dire que c'est vraiment universel? haha. Premièrement, une bonne stratégie n'a pas peur d'être publique, ce n'est pas un développement d'armes de combat au niveau de la guerre qui décidera de la vie ou de la mort, donc moi-même et d'autres agences ou individus, je n'ai pas peur des soi-disant secrets stratégiques, car à mon avis, le CTA n'a pas de secret.

Deuxièmement, beaucoup de gens, qu'ils soient débutants ou débutants, voire même des joueurs expérimentés, ont besoin d'inspiration, y compris l'exploration des facteurs de l'action, les idées de stratégie de choix du moment, etc. Ces sources sont souvent l'expérience subjective, les rapports de recherche, l'échange de communication dans le cercle, etc.

En conclusion, la quantification était un phénomène domestique, les transactions programmatiques appartenaient à la sous-catégorie de la quantification, dès l'époque de l'université elle-même (environ 2009), alors que des programmes tels que TB, pyramides et autres étaient en cours de chasse, et si cela se poursuit aujourd'hui, on peut dire que cette partie des premiers prédicateurs de l'avenir est de 10 ans, sans compter les stratégies et les systèmes à haute fréquence qui sont revenus de Wall Street. Par conséquent, la stratégie de la quantification ou la stratégie de la programmation en Chine a duré pendant un certain temps, mais dans le cercle actuel de parts de marché et d'acteurs, ainsi que le soutien des politiques, la quantification est toujours une petite partie de la réalité, malgré des études remplies d'analyses et de modèles stratégiques.

Enfin, je remercie le public pour sa confiance en moi et pour l'invitation à écrire un article. Si vous avez des questions spécifiques sur le code et la stratégie, veuillez m'envoyer un e-mail personnel ou à T-Bone, je suis dans le groupe T-Bone.

Je vous remercie encore une fois pour votre magnifique exposé!

Pour ceux qui n'ont pas encore rejoint le groupe de discussion quantitative, rejoignez-le rapidement pour en apprendre davantage!

Le bâtiment de la ville!

img

Le WeChat a été effacé Attention au numéro du public


/*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)
    }
}

Plus de

Je suis désolée.Pourriez-vous le transformer en version Bitcoin?